通过OR或AND连接(粘合)条件(Arel,Rails3)

时间:2010-11-06 06:26:55

标签: sql ruby-on-rails subquery where arel

我有几个复杂查询(使用子查询等等),并希望将它们与OR或AND语句粘合在一起。

例如:

where1=table.where(...)
where2=table.where(...)

我想要像

这样的东西
where3=where1.or where2

下一个例子对我不起作用:

users.where(users[:name].eq('bob').or(users[:age].lt(25)))

因为我有几个where(..)查询,我想连接他们

换句话说

我有3个方法:首先返回第一个,第二个,第三个 - 或者连接。

我必须能够在我的应用程序中使用所有3种方法并保存 DRY 代码

3 个答案:

答案 0 :(得分:2)

你正在寻找表格吗?

users.where(users[:name].eq('bob').or(users[:age].lt(25)))

docs:https://github.com/rails/arel

答案 1 :(得分:1)

users.where(users [:name] .eq('bob')。或(users [:age] .lt(25)))已关闭,但您需要获取arel_table来指定列,例如

t = User.arel_table
User.where(t[:name].eq('bob').or(t[:age].lt(25)))

答案 2 :(得分:0)

我知道,对于AND连接,你可以这样做:

users = User.where(:name => 'jack')
users = users.where(:job => 'developer')

并在SQL中与AND连接(最后在#to_sql处尝试)

除此之外,您可以这样做:

where1=table.where(...)
where2=table.where(...)
where1 & where2

示例:

(User.where(:name => 'jack') & User.where(:job => 'dev')).to_sql
=> "SELECT `users`.* FROM `users` WHERE `users`.`name` = 'jack' AND `users`.`job` = 'dev'"