web-dev-qa-db-fra.com

Est-ce que Rails 4 supporte les OR requêtes

Ainsi, dans Rails 4) la longue fonctionnalité souhaitée pour utiliser not requêtes a été ajoutée.

Article.where.not(title: 'Rails 3')

Un support similaire a-t-il été ajouté pour les requêtes or ou envisage-t-il de le créer? Je n'ai rien trouvé en parcourant les notes de publication.

Évidemment j'ai essayé

Article.where(title: 'Rails 3').or(title: 'Rails 4')

Mais ça ne marche pas.

62
Arjan

Article.where(title: ['Rails 3', 'Rails 4']) est ce que vous feriez dans Active Record.

Il n'est pas possible de répliquer une requête SQL arbitraire à l'aide de la syntaxe "Rails-y". Mais vous pouvez toujours simplement passer en sql littéral.

Donc vous pouvez aussi faire:

Article.where("articles.title = 'Rails 3' OR articles.title = 'Rails 4'")
90
gregates

Cela fonctionne maintenant dans Rails 5:

Article.where(title: 'Rails 3').or(Article.where(title: 'Rails 4'))

Exemple de code dans le source de Rails .

34
Fellow Stranger

L'alternative la plus courante consiste déjà à répondre par @gregates

Récemment, il y a eu une demande d'extraction dans Rails source

Ajouter #any_of méthode d’interrogation vers active_record Ce qui ajoute ou fonctionnalité à activerecord

le contributeur a déjà créé une gemme alors que ce n'est pas accepté

son Rails 3.2 et 4 compatibles

https://github.com/oelmekki/activerecord_any_of

Je n'ai pas encore essayé, mais je souhaite bientôt l'utiliser.

12
Pritesh Jain

Je sais qu'il s'agit d'un vieux fil de discussion, mais toute autre personne à la recherche d'une solution à ce problème pourrait trouver ce code utile:

Article.where(title: ["Rails 3", "Rails 4"])

Cela vous aidera peut-être à engager quelqu'un dans la bonne direction sans avoir à risquer une injection SQL.

5
Rob Richey

Il semble que la Rails branche principale supporte maintenant les OR requêtes. https://github.com/Rails/ rails/pull/16052

Je suppose que ce sera dans le cadre de la prochaine version majeure.

4
Arjan

Rails 5 le supportera mais vous pouvez utiliser ce backport pour Rails 4.2: https://github.com/Eric-Guo/where-or

3
Nicolas Maloeuvre

Vous pouvez utiliser Squeel pour les requêtes plus complexes:

Article.where{(title == 'Rails 3') | (title == 'Rails 4')}

Cela se traduit par la requête SQL suivante:

SELECT `articles`.* FROM `articles` WHERE ((`articles`.`title` = 'Rails 3' OR `articles`.`title` = 'Rails 4'))
1
Stefan