web-dev-qa-db-fra.com

Dans Rails 4.1, comment trouver des enregistrements par symbole d'énumération?

Supposons que j'ai ce modèle:

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

Comment puis-je trouver toutes les conversations actives sans utiliser la valeur numérique de l'énumération ou sans avoir à répéter chaque conversation?

J'ai essayé de faire Conversation.where(status: :active), mais cela n'a donné aucun résultat.

La seule solution qui me vient à l'esprit est d'itérer sur toutes les conversations et de sélectionner les conversations actives, mais cela ne semble pas être une bonne solution.

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

Y a-t-il quelque chose que je puisse faire à ce sujet?

40
Abdulaziz

ActiveRecord::Enum fournit des étendues basées sur ses valeurs.

Essayez simplement:

Conversation.active

ou

Conversation.archived

Bien sûr, vous pouvez créer vos propres étendues comme Kyle Decot mentionné.

56
Kensuke Naito

Cela fonctionne très bien:

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

Pour une raison quelconque, cela ne fonctionne PAS:

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

Mise à jour

Toutes les instructions ci-dessus fonctionnent avec Rails 5. Bon codage!

38
Mirror318

ActiveRecord :: Enum fournit des étendues intégrées basées sur les valeurs afin que vous puissiez simplement faire:

Conversation.active
Conversation.archived
26
Kyle Decot
Conversation.where(status: Conversation.statuses[:active])
7
6ft Dan

Avez-vous essayé Conversation.where(status: [:active, :archived])? Comme indiqué ici .

3
Shifa Khan