Ruby on Rails 3如何使'OR'条件

我需要一个SQL语句来检查是否满足一个条件:

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

我想这样做'Rails 3'的方式。 我正在寻找像这样的东西:

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

我知道我总是可以回退到sql或条件string。 但是,以我的经验来看,这往往会导致合并范围时出现混乱。 做这个的最好方式是什么?

另一个相关的问题是,如何描述依赖于OR条件的关系。 我发现的唯一方法是:

 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}' 

但是,这些在组合使用时会再次断裂。 有没有更好的方法来指定这个?

不幸的是,这个.or还没有实现(但是当它真的很棒的时候)。

所以你必须做一些事情:

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

这样,你仍然可以做到,做到:

 Project.sufficient_data.profitable 

Account.where(id: [1,2])不需要解释。

这将在Rails 5中起作用,请参阅rails master :

 Post.where('id = 1').or(Post.where('id = 2')) # => SELECT * FROM posts WHERE (id = 1) OR (id = 2) 

对于Rails 3.0.4+:

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

这些arel查询对我来说是不可读的。

什么是错误的SQLstring? 实际上,Rails指南将这种方式公开为查询条件的第一种方式: http : //guides.rubyonrails.org/active_record_querying.html#array-conditions

所以,我敢打赌,这样做是为了“Rails方式”:

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

在我看来,它更短,更清晰。

我会去与IN子句,例如:

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

我使用了Squeel gem( https://github.com/ernie/squeel/ )来完成OR查询,而且效果非常好。

它可以让你把你的查询写成Account.where{(id == 1) | (id == 2)} Account.where{(id == 1) | (id == 2)}

您可以在:conditions Hash中将数组定义为值。

所以你可以做例如:

 Account.all(:conditions => { :id => [1, 2] }) 

testing了Rails 3.1.0

使用散列的替代语法

 Account.where("id = :val1 OR id = :val2", val1: 1, val2: 2). 

当值与多列进行比较时,这是特别有用的。 例如:

 User.where("first_name = :name OR last_name = :name", name: 'tom') 

与rails_or ,你可以这样做:

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

(它也适用于Rails 4和5。)