2017-09-06 3 views
1

J'essaie d'interroger une énumération de modèle d'activationecord et d'utiliser l'opérateur like dans la méthode where, et cela ne fonctionne tout simplement pas. Y at-il un truc pour me permettre d'interroger une énumération de cette façon? Fonctionne bien sur les colonnes régulières. Ici, c'est dans la console.rails 5 enum où "like"

colonne de chaîne régulière (titre) fonctionne comme indiqué ci-dessous

irb(main):092:0> Proposal.select(:id,:department,:status).where('title like "test%"') 
Proposal Load (0.3ms) SELECT "proposals"."id", "proposals"."department", "proposals"."status" FROM "proposals" WHERE (title like "test%") LIMIT ? [["LIMIT", 11]] 
=> #<ActiveRecord::Relation [#<Proposal id: 7, department: 1, status: "In Progress">, #<Proposal id: 61, department: 2, status: "Won">]> 

Cependant, l'essayer sur un ENUM, donne aucun résultat.

irb(main):094:0> Proposal.select(:department,:status).where('status like "Wo%"') 
Proposal Load (0.3ms) SELECT "proposals"."department", "proposals"."status" FROM "proposals" WHERE (status like "Wo%") LIMIT ? [["LIMIT", 11]] 
=> #<ActiveRecord::Relation []> 

Une idée de pourquoi je ne peux pas utiliser comme opérateur sur enum? J'essaye d'utiliser ceci pour filtrer une vue avec le traitement de côté de serveur de datatables.net.

Répondre

1

Enum stocke les données sous la forme d'un nombre entier comme 0,1,2,3 ... Puis les rails mappent le nombre sur la valeur enum définie dans le modèle. C'est pourquoi vous n'obtenez pas de résultat

+0

Ainsi, Proposal.where ("title like 'Coat%'") fonctionne sur une colonne de type chaîne, mais pas enum, car la valeur entière de l'énumération se trouve dans la base de données. et la méthode .where n'a aucune connaissance de l'énumération? C'est plutôt limitatif. Supposons que le seul choix est de le déplacer vers un modèle plutôt que de l'énumérer. –

+0

Je ne comprends pas pourquoi vous voulez utiliser 'like' dans votre cas. Quand vous définissez enum, vous avez une liste de quelques chaînes/symboles et vous pouvez créer une requête de cette manière 'Proposal.where (titre:% i [titre1 titre2 titre3])'. Si title est juste une chaîne personnalisée, n'utilisez pas enum. –

+0

Je montre le statut sur une vue d'index des propositions, et avec des données de datatables.net je peux faire une recherche partielle sur n'importe quel champ (excepté le champ d'enum). Ce serait bien de pouvoir taper pend et de le filtrer pour les propositions en suspens. Comme j'utilise le traitement côté serveur sur les datatables, je dois faire ma recherche comme "où nom comme '% pend%' ou statut comme '% pend%', etc –