`.where` 带有枚举映射列的 ARel 查询 returns 只包含带有 `0` 的条目
`.where` ARel query with enum mapped column returns exclusively entries with `0`
我有一个模型,其中一个字段有一个枚举。
class Foo < ActiveRecord::Base
enum status: [:yes, :no, :maybe, :so]
end
状态为整型字段。对于任何 Foo
记录,我可以按预期使用 foo.yes!, foo.no!
等,相应的记录 returns 对 foo.yes?, foo.no?
为真。
但是,当我尝试查询所有 status='no'
、status='maybe'
或 status='so'
记录时(使用方法 Foo.where(status: 'no')
、Foo.where(status: 'maybe')
等)。 ),它总是 returns 个 status='yes'
条目。我检查了原始 SQL 查询,它似乎总是只查询 status=0
或状态为 yes
的时间。
为什么会这样?
因为 Arel 尝试将提供的字符串转换为整数并在查询中使用该整数。这是预期的行为。
要解决您的问题,您可以使用 Array#index
方法:
Foo.where(status: Foo.statuses.index('no'))
但只有直接使用 Arel 时才需要这种方法。 ActiveRecord 已经帮你解决了。
ActiveRecord 不提供查询枚举的接口。
您可以查询
Foo.where(status: 0)
或者
Foo.yes
我有一个模型,其中一个字段有一个枚举。
class Foo < ActiveRecord::Base
enum status: [:yes, :no, :maybe, :so]
end
状态为整型字段。对于任何 Foo
记录,我可以按预期使用 foo.yes!, foo.no!
等,相应的记录 returns 对 foo.yes?, foo.no?
为真。
但是,当我尝试查询所有 status='no'
、status='maybe'
或 status='so'
记录时(使用方法 Foo.where(status: 'no')
、Foo.where(status: 'maybe')
等)。 ),它总是 returns 个 status='yes'
条目。我检查了原始 SQL 查询,它似乎总是只查询 status=0
或状态为 yes
的时间。
为什么会这样?
因为 Arel 尝试将提供的字符串转换为整数并在查询中使用该整数。这是预期的行为。
要解决您的问题,您可以使用 Array#index
方法:
Foo.where(status: Foo.statuses.index('no'))
但只有直接使用 Arel 时才需要这种方法。 ActiveRecord 已经帮你解决了。
ActiveRecord 不提供查询枚举的接口。 您可以查询
Foo.where(status: 0)
或者
Foo.yes