2016-04-07 57 views
2

我使用一个模型枚举使用枚举:导轨 - 在。凡查询

enum status: [:pending, :approved]

我在模型中的唯一性验证,看起来像这样:

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

这不起作用。如果我将:approved更改为1,它才会起作用。我很困惑,为什么我不能在这里使用状态名称,当我可以做一些像Item.first.update_attributes(status: :approved),它工作正常。

回答

8

从模型中使用枚举值,像这样:

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

而不仅仅是象征。这样,statuses的枚举帮助器方法将传递将使过滤器工作的枚举的整数值。枚举值实际上作为整数存储在数据库中,而不是作为符号的字符串表示。

+0

所以,只是为了澄清我什么时候可以而且不能只使用符号?使用符号设置属性似乎工作得很好。 – user4584963

+1

当您使用enum rails内部使用枚举的名称创建getter和setter方法并且getter将始终返回相应整数值的字符串键时,当您调用setter并传递符号时,rails将查找整数值并设置它,这是什么被持久化在数据库(整数),所以当你查询activerecord时,会尝试过滤一个字符串的数据库中的整数列,当然不会工作。因此,长话短说,用enum复数散列返回的值进行查询,如果您愿意,可以使用符号进行赋值。 –

+1

刚刚查看了文档,似乎当前不稳定版本的rails允许在查询中使用符号:http://edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html –