Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

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

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?

like image 958
Abdulaziz Avatar asked Aug 03 '14 02:08

Abdulaziz


3 Answers

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.

like image 185
Kensuke Naito Avatar answered Sep 28 '22 10:09

Kensuke Naito


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!

like image 21
Mirror318 Avatar answered Sep 28 '22 08:09

Mirror318


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

Conversation.active
Conversation.archived
like image 24
Kyle Decot Avatar answered Sep 28 '22 09:09

Kyle Decot