Comment la portée de chaîne de requêtes avec OU à la place de ET?
Je suis en utilisant Rails3, ActiveRecord
Demandais juste comment puis-je chain les étendues avec OU déclarations plutôt que ET.
par exemple
Person.where(:name => "John").where(:lastname => "Smith")
Qui renvoie normalement:
name = 'John' AND lastname = 'Smith'
mais je voudrais:
`name = 'John' OR lastname = 'Smith'
- Peuvent peut-être aider: ActiveRecord OU de la requête de Hachage de la notation
Vous devez vous connecter pour publier un commentaire.
Vous ne
Droit maintenant, il n'y a pas une autre OU de soutien par le nouveau AR3 syntaxe (qui est sans recours à la 3ème partie gem).
.or
construit en.Utilisation ARel
Selon ce pull request, Rails 5 prend maintenant en charge la syntaxe suivante pour le chaînage de requêtes:
Il y a aussi un rétroportage de la fonctionnalité dans les Rails 4.2 via ce joyau.
Mise à jour pour Rails4
nécessite pas de 3ème partie gemmes
Vieille réponse
nécessite pas de 3ème partie gemmes
or
ou d'autres opérateurs à l'intérieur d'un bloc de texte, ni de ce qui se reflète dans l'OP du code....where_values.join(' OR ')
dans mon cas.tap {|sc| sc.bind_values = [a, b].map(&:bind_values) }
partie si votre étendues n'ont pas toutes les variables qui ont besoin de liaison.Seulement l'affichage de la syntaxe de Tableau pour même de colonne OU de requêtes à l'aide perce.
Au cas où quelqu'un est à la recherche d'une mise à jour de répondre à cette question, il semble qu'il y est une pull request à faire entrer ça dans les Rails: https://github.com/rails/rails/pull/9052.
Grâce à @j-mcnally du singe patch pour ActiveRecord (https://gist.github.com/j-mcnally/250eaaceef234dd8971b) vous pouvez effectuer les opérations suivantes:
Encore plus précieux est la capacité de la chaîne d'étendues avec
OR
:Ensuite, vous pouvez rechercher toutes les Personnes avec le prénom ou le nom ou dont le parent avec le nom
Pas le meilleur exemple pour l'utilisation de cela, mais juste essayer de l'adapter avec la question.
.or
de la chaîne de la fonctionnalité. J'ai été en mesure d'utiliser le singe patch je l'ai mentionné sur Rails >= 3.2; cependant, vous voudrez peut-être attendre pour les Rails de 5 à introduire de longue date des modifications à votre code.Vous pouvez également utiliser MetaWhere bijou à ne pas mélanger votre code avec SQL trucs:
Pour moi (Rails 4.2.5) il fonctionne comme ceci:
Ce serait un bon candidat pour MetaWhere si vous êtes à l'aide de Rails 3.0+, mais il ne fonctionne pas sur des Rails 3.1. Vous pouvez essayer des squeel à la place. Elle est faite par le même auteur. Voici comment vous feriez effectuer un, OU en fonction de la chaîne:
Vous pouvez mélanger et assortir et/OU, parmi de nombreux autres des choses incroyables.
Une version mise à jour de Rails/ActiveRecord peut soutenir cette syntaxe native. Il devrait ressembler à:
Comme indiqué dans cette demande de pull https://github.com/rails/rails/pull/9052
Pour l'instant, il suffit de s'en tenir à la suite de grandes œuvres:
Foo.where(foo: 'bar1').or.where(bar: 'bar2')
ne fonctionne pas. Il convient de Foo.où(foo: 'bar1').ou.où(Foo.où(barre: "bar2'))Rails 4 + Portée + Arel
J'ai essayé de chaînage nommé étendues avec .ou et pas de chance, mais cela a fonctionné pour trouver quoi que ce soit avec ceux des booléens ensemble. Génère le SQL comme
Rails 4
Si vous ne pouvez pas écrire la clause where manuellement afin d'y inclure "ou" déclaration (c'est à dire, vous souhaitez combiner les deux étendues de), vous pouvez utiliser de l'union:
(source: ActiveRecord Requête Union)
C'est la volonté de renvoyer tous les enregistrements correspondant, soit à la requête. Cependant, cette fonction retourne un tableau, pas un arel. Si vous voulez vraiment retourner un arel, vous commander ce gist: https://gist.github.com/j-mcnally/250eaaceef234dd8971b.
Cela va faire le travail, aussi longtemps que vous n'avez pas l'esprit monkey patching rails.
Voir aussi ces questions connexes: ici, ici et ici
Pour les rails 4, basé sur cet article et cette réponse originale à cette question
Note l'article de l'attention à la fin:
Si vous êtes à la recherche pour fournir un champ d'application (au lieu de explicitement de travail sur le jeu de données entier) voici ce que vous devez faire avec les Rails 5:
Ou:
la
squeel
gem fournit un moyen extrêmement simple d'accomplir cette (avant cela, j'ai utilisé quelque chose comme @coloradoblue de la méthode):Donc la réponse à la question d'origine, pouvez vous joindre à des étendues avec " ou "au lieu de" et " semble être "non vous ne pouvez pas". Mais vous pouvez remettre code un de complètement différent de la portée ou de la requête qui fait le travail, ou utiliser un autre cadre de ActiveRecord par exemple MetaWhere ou Squeel. Pas utile dans mon cas
Je suis " ou avec un champ généré par pg_search, qui est un peu plus que de sélectionner, il comprend la commande par NCP, qui en fait un gâchis de l'union. Je veux " ou " elle fabriqués à la main avec un champ d'application qui n'des choses que je ne peux pas faire dans pg_search. J'ai donc dû le faire comme cela.
I. e. tourner les étendues dans sql, mettre des parenthèses autour de chacun, de l'union de l'ensemble et puis find_by_sql en utilisant le sql généré. C'est un peu de la foutaise, mais il fonctionne.
Non, ne me dites pas que je peux utiliser "contre: [:nom,:le code]" dans pg_search, je voudrais le faire comme ça, mais le champ " nom " est un hstore, qui pg_search ne peut pas gérer encore. Ainsi, le champ d'application par nom de a à être fabriqués à la main et ensuite fusionné avec la pg_search portée.
C'est un moyen très pratique et il fonctionne très bien dans les Rails 5: