【问题标题】:Rails - using enum in a .where queryRails - 在 .where 查询中使用枚举
【发布时间】:2016-07-29 00:38:18
【问题描述】:

我在模型上使用枚举:

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) 之类的操作并且它工作正常时,为什么我不能在这里使用状态名称,我对此感到困惑。

【问题讨论】:

    标签: ruby-on-rails activerecord enums


    【解决方案1】:

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

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

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

    【讨论】:

    • 所以只是为了澄清什么时候我可以和不能只使用这个符号?使用符号设置属性似乎工作得很好。
    • 当您使用枚举时,rails 在内部创建一个带有枚举名称的 getter 和 setter 方法,当您调用 setter 并传递符号时,getter 将始终返回相应整数值的字符串键rails 将查找整数值并设置它,这就是在数据库中持久保存的内容(整数),因此当您查询 activerecord 时,将尝试使用字符串过滤数据库中的整数列,这当然不会起作用。因此,长话短说,使用枚举复数哈希返回的值进行查询,并根据需要使用符号分配。
    • 刚刚查看了文档,似乎当前不稳定版本的 rails 现在允许在查询中使用符号:edgeapi.rubyonrails.org/classes/ActiveRecord/Enum.html
    • 使用枚举自动提供scopes匹配模型上的枚举,所以整个where(...)也可以只替换为Model.approved
    • @dlauzon 是的,但在这种特殊情况下,OP 想要的是在验证条件中进行过滤,因此不确定使用范围是否有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 2017-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多