In Rails 4.1, how to find records by enum symbol?

非 Y 不嫁゛ 提交于 2019-12-29 16:08:30

问题


Assume I have this model:

class Conversation < ActiveRecord::Base
  enum status: [ :active, :archived ]
end

How can I find all active conversations without using the numeric value of the enum or without having to iterate over each conversation?

I tried doing Conversation.where(status: :active), but it didn't yield any results.

The only solution comes to mind is to iterate over all conversations and select the active ones, but it doesn't look like a good solution.

Conversation.all.select {|conversation| conversation.active? }  

Is there anything I can do about this?


回答1:


ActiveRecord::Enum provides scopes based on its values.

Just try:

Conversation.active

or

Conversation.archived

Of course, you can create your own scopes as Kyle Decot mentioned.




回答2:


This works great:

Conversation.where("conversation.status = ?", Conversation.statuses[:active])

For some reason this does NOT work:

Conversation.where(status: :active) #searches for NULL
Conversation.where(status: 'active') #searches for status=0 no matter what the enum

Update

All the above statements work with Rails 5. Happy coding!




回答3:


ActiveRecord::Enum provides built-in scopes based on the values so you can simply do:

Conversation.active
Conversation.archived



回答4:


Conversation.where(status: Conversation.statuses[:active])



回答5:


Did you try Conversation.where(status: [:active, :archived]) ? As listed here.




回答6:


try this:

.enum :status => {:active => "active", :archived => "archived"ok_off => "took off"}


来源:https://stackoverflow.com/questions/25101009/in-rails-4-1-how-to-find-records-by-enum-symbol

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!