208 votes

Requête ActiveRecord OR

C'est une question embarrassante, mais ...

Comment faites-vous une requête OR dans Rails 3 ActiveRecord. Tous les exemples que je trouve ne contiennent que des requêtes AND.

Edit: sans utiliser de chaîne SQL!

237voto

deadkarma Points 1086

Si vous souhaitez utiliser un opérateur OR sur la valeur d'une colonne, vous pouvez passer un tableau à .where et ActiveRecord à utiliser IN(value,other_value) :

Model.where(:column => ["value", "other_value"]

les sorties:

 SELECT `table_name`.* FROM `table_name` WHERE `table_name`.`column` IN ('value', 'other_value')
 

Cela devrait atteindre l'équivalent d'un OR sur une seule colonne

177voto

rubyprince Points 7665

dans Rails 3, il devrait être

 Model.where("column = ? or other_column = ?", value, other_value)
 

Cela inclut également sql brut mais je ne pense pas qu'il existe un moyen dans ActiveRecord de faire une opération OR. Votre question n'est pas une question noob.

115voto

Dan McNevin Points 15319

Utilisez ARel

 t = Post.arel_table

results = Post.where(
  t[:author].eq("Someone").
  or(t[:title].matches("%something%"))
)
 

Le SQL résultant:

 ree-1.8.7-2010.02 > puts Post.where(t[:author].eq("Someone").or(t[:title].matches("%something%"))).to_sql
SELECT     "posts".* FROM       "posts"  WHERE     (("posts"."author" = 'Someone' OR "posts"."title" LIKE '%something%'))
 

15voto

Rafał Cieślak Points 460

Si vous voulez utiliser des tableaux comme arguments, le code suivant fonctionne dans Rails 4:

 query = Order.where(uuid: uuids, id: ids)
Order.where(query.where_values.map(&:to_sql).join(" OR "))
#=> Order Load (0.7ms)  SELECT "orders".* FROM "orders" WHERE ("orders"."uuid" IN ('5459eed8350e1b472bfee48375034103', '21313213jkads', '43ujrefdk2384us') OR "orders"."id" IN (2, 3, 4))
 

Plus d'informations: OU interroge avec des tableaux comme arguments dans Rails 4 .

5voto

Toby Hede Points 22128

Ajoutez simplement un OU dans les conditions

 Model.find(:all, :conditions => ["column = ? OR other_column = ?",value, other_value])
 

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X