Dans les Rails 4.1, comment trouver des enregistrements par enum symbole?
Assumer j'ai ce modèle:
class Conversation < ActiveRecord::Base
enum status: [ :active, :archived ]
end
Comment puis-je trouver toutes les conversations actives sans l'aide de la valeur numérique de l'enum ou sans avoir à répéter sur chaque conversation?
J'ai essayé de faire Conversation.where(status: :active)
, mais qui n'a pas donné de résultats.
La seule solution qui vient à l'esprit est d'itérer sur toutes les conversations et de sélectionner les actifs, mais il ne me semble pas une bonne solution.
Conversation.all.select {|conversation| conversation.active? }
Est-ce que je peux faire à ce sujet?
- Il travaillera dans les Rails 5 github.com/rails/rails/issues/19964
Vous devez vous connecter pour publier un commentaire.
ActiveRecord::Enum
fournit des étendues en fonction de ses valeurs.Juste essayer:
ou
Bien sûr, vous pouvez créer votre propre étendues comme Kyle Decot mentionné.
Cela fonctionne très bien:
Pour une raison quelconque, cela ne fonctionne PAS:
Mise à jour
Toutes les déclarations ci-dessus sont compatibles avec Rails 5. Amusez-vous bien!
Conversation.where(status: Conversation.statuses[:active])
. Pas besoin de chaînes.Person.joins(:conversations).where(conversations: {status: :active})
erreurs). Utiliser la première méthode pour l'instant (Person.joins(:conversations).where(conversations: {status: Conversation.statuses[:active]})
).ActiveRecord::Enum intègre dans des étendues sur la base des valeurs de sorte que vous pouvez tout simplement faire:
enum status: %i[active archived]
, vous avez déjà.active
et.archived
étendues.Conversation.statuses[:active]
devrait fonctionnerAvez-vous essayé
Conversation.where(status: [:active, :archived])
?Énumérés ici.
Conversation.where(status: Conversation.statuses[my_conversation.status])
. Aucune idée de pourquoi ça ne fonctionne pas ?essayez ceci: