Abd*_*ziz 42 ruby ruby-on-rails ruby-on-rails-4 rails-activerecord ruby-on-rails-4.1
假设我有这个模型:
class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
Run Code Online (Sandbox Code Playgroud)
如何在不使用枚举的数值或不必迭代每个对话的情况下找到所有活动对话?
我试过了Conversation.where(status: :active),但没有产生任何结果.
想到的唯一解决方案是迭代所有对话并选择活动对话,但它看起来不是一个好的解决方案.
Conversation.all.select {|conversation| conversation.active? }
Run Code Online (Sandbox Code Playgroud)
我能做些什么吗?
小智 59
ActiveRecord::Enum 根据其值提供范围.
试一试:
Conversation.active
Run Code Online (Sandbox Code Playgroud)
要么
Conversation.archived
Run Code Online (Sandbox Code Playgroud)
当然,您可以像Kyle Decot所提到的那样创建自己的范围.
Mir*_*318 41
这非常有效:
Conversation.where("conversation.status = ?", Conversation.statuses[:active])
Run Code Online (Sandbox Code Playgroud)
由于某种原因,这不起作用:
Conversation.where(status: :active) #searches for NULL
Conversation.where(status: 'active') #searches for status=0 no matter what the enum
Run Code Online (Sandbox Code Playgroud)
以上所有语句都适用于Rails 5.快乐的编码!
Kyl*_*cot 27
ActiveRecord :: Enum提供基于值的内置范围,因此您可以简单地执行以下操作:
Conversation.active
Conversation.archived
Run Code Online (Sandbox Code Playgroud)
Conversation.where(status: Conversation.statuses[:active])
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
22847 次 |
| 最近记录: |