50 votes

Ruby on Rails 3 comment faire "OU" condition

J'ai besoin d'une instruction SQL qui vérifier si une condition est remplie:

SELECT * FROM my_table WHERE my_table.x=1 OR my_table.y=1

Je veux faire le "Rails 3' façon. Je cherchais quelque chose comme:

Account.where(:id => 1).or.where(:id => 2)

Je sais que je peux toujours le secours de sql ou de l'une des conditions de la chaîne. Cependant, dans mon expérience, cela conduit souvent à des chaos lors de la combinaison des étendues. Quelle est la meilleure façon de le faire?

Une autre question, c'est comment décrire la relation qui dépend d'un OU d'une condition. Le seul moyen que j'ai trouvé:

has_many :my_thing, :class_name => "MyTable",  :finder_sql => 'SELECT my_tables.* ' + 'FROM my_tables ' +
'WHERE my_tables.payer_id = #{id} OR my_tables.payee_id = #{id}'

Cependant, ces pauses lorsque utilisé dans les combinaisons. EST-il une meilleure façon de préciser ce?

114voto

Mike Campbell Points 3705

Account.where(id: [1,2]) aucune explication nécessaire.

73voto

weston Points 1132

Cela fonctionne maintenant, testé sur Rails 3.0.4:

 accounts = Account.arel_table
Account.where(accounts[:id].eq(1).or(accounts[:id].eq(2)))
 

16voto

David Points 5988

Ces requêtes sont illisibles pour moi.

Quel est le problème avec une chaîne SQL? En fait, les guides Rails exposent cette manière comme première façon de créer des conditions dans les requêtes: http://guides.rubyonrails.org/active_record_querying.html#array-conditions

Donc, je parie que pour cette façon de le faire comme "Rails way":

 Account.where("id = 1 OR id = 2")
 

À mon humble avis, c'est plus court et plus clair.

9voto

Jesse Wolgamott Points 30552

Malheureusement, le .or n'est pas encore implémenté (mais quand il l'est, ce sera génial).

Donc, vous devrez faire quelque chose comme:

 class Project < ActiveRecord::Base
  scope :sufficient_data, :conditions=>['ratio_story_completion != 0 OR ratio_differential != 0']
  scope :profitable, :conditions=>['profit > 0']
 

De cette façon, vous pouvez toujours être génial et faire:

 Project.sufficient_data.profitable
 

6voto

jpemberthy Points 4063

J'irais avec la clause IN , par exemple:

 Account.where(["id in (?)", [1, 2]])
 

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