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?
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é.
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
Toutes les instructions ci-dessus fonctionnent avec Rails 5. Bon codage!
ActiveRecord :: Enum fournit des étendues intégrées basées sur les valeurs afin que vous puissiez simplement faire:
Conversation.active
Conversation.archived
Conversation.where(status: Conversation.statuses[:active])
Avez-vous essayé Conversation.where(status: [:active, :archived])
? Comme indiqué ici .