Rails 5 Polymorphic association with enum is throwing `ERROR: invalid input syntax for type integer`
Rails 5 Polymorphic association with enum is throwing `ERROR: invalid input syntax for type integer`
我有一个Log
模型,通过多态关联属于很多模型。对于类型列,它使用 enum
,它在 Rails 4.2 上运行良好,但在升级到 Rails 5 后,它会抛出 ERROR: invalid input syntax for type integer
class Log
enum loggable_type: %i[a b c d]
# ...
end
class A
has_many :logs, as: :loggable, dependent: :destroy
# ...
end
获取日志时:
a = A.find id
a.logs
它抛出以下错误:
ActiveRecord::StatementInvalid (PG::InvalidTextRepresentation: ERROR: invalid input syntax for type integer: "A")
: SELECT "logs".* FROM "logs" WHERE "logs"."loggable_id" = AND "logs"."loggable_type" =
在 Rails 4.2 中,相同的代码运行良好。这是相同的查询:
> a.logs
Log Load (2.0ms) SELECT "logs".* FROM "logs" WHERE "logs"."loggable_id" = AND "logs"."loggable_type" = [["loggable_id", 1111111], ["loggable_type", 0]]
=> #<ActiveRecord::Associations::CollectionProxy []>
我需要做什么才能使其适用于 Rails 5?
根据 Rails 文档和提出的问题 here,多态类型列应该是字符串,而不是整数。使用这种方法,我不得不迁移旧数据。
幸运的是,有一个 gem polymorphic_integer_type 可以解决完全相同的问题。
在 Gemfile 和 运行 包中包含 gem 之后,我所要做的就是:
class Log
include PolymorphicIntegerType::Extensions
belongs_to :loggable, polymorphic: { 1 => 'A', 2 => 'B', 3 => 'C', 4 => 'D' }
end
而且效果非常好。
我有一个Log
模型,通过多态关联属于很多模型。对于类型列,它使用 enum
,它在 Rails 4.2 上运行良好,但在升级到 Rails 5 后,它会抛出 ERROR: invalid input syntax for type integer
class Log
enum loggable_type: %i[a b c d]
# ...
end
class A
has_many :logs, as: :loggable, dependent: :destroy
# ...
end
获取日志时:
a = A.find id
a.logs
它抛出以下错误:
ActiveRecord::StatementInvalid (PG::InvalidTextRepresentation: ERROR: invalid input syntax for type integer: "A")
: SELECT "logs".* FROM "logs" WHERE "logs"."loggable_id" = AND "logs"."loggable_type" =
在 Rails 4.2 中,相同的代码运行良好。这是相同的查询:
> a.logs
Log Load (2.0ms) SELECT "logs".* FROM "logs" WHERE "logs"."loggable_id" = AND "logs"."loggable_type" = [["loggable_id", 1111111], ["loggable_type", 0]]
=> #<ActiveRecord::Associations::CollectionProxy []>
我需要做什么才能使其适用于 Rails 5?
根据 Rails 文档和提出的问题 here,多态类型列应该是字符串,而不是整数。使用这种方法,我不得不迁移旧数据。
幸运的是,有一个 gem polymorphic_integer_type 可以解决完全相同的问题。
在 Gemfile 和 运行 包中包含 gem 之后,我所要做的就是:
class Log
include PolymorphicIntegerType::Extensions
belongs_to :loggable, polymorphic: { 1 => 'A', 2 => 'B', 3 => 'C', 4 => 'D' }
end
而且效果非常好。