`.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