Rails - 在.where查询中使用枚举

use*_*963 4 enums activerecord ruby-on-rails

我在模型上使用枚举:

enum status: [:pending, :approved]

我在模型中有一个唯一性验证,如下所示:

validates :item_id, uniqueness: { scope: :user_id, conditions: -> { where(status: :approved) }, message: "You already have this item." }
Run Code Online (Sandbox Code Playgroud)

这不起作用.如果我改变它只会工作:approved1.我很困惑,为什么我不能在这里使用状态名称,当我可以做类似的事情Item.first.update_attributes(status: :approved),它工作正常.

Gus*_*bio 13

使用模型中的枚举值,如下所示:

where(status: Model.statuses[:approved])

而不仅仅是符号.这样enum helper方法statuses将传递enum 的整数值,这将使过滤器工作.枚举值实际上作为整数存储在DB中,而不是符号的字符串表示形式.

  • 使用枚举会自动提供与模型上的枚举匹配的[范围](https://api.rubyonrails.org/v5.2.6/classes/ActiveRecord/Enum.html),因此整个“where(...)”也可以仅替换为“Model.approved”。 (3认同)
  • 只是看了一下文档,似乎当前不稳定的rails版本现在允许在查询中使用符号:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html (2认同)