如何使用ActiveRecord组合AND和OR运算符?

时间:2015-08-03 14:15:59

标签: ruby-on-rails postgresql activerecord

我需要发出可以实现此行为的SQL请求:

SELECT * FROM table WHERE (created_at > '2010/01/01' AND created_at < '2010/12/01') OR (created_at > '2012/01/01' AND created_at < '2012/12/31')

目标是获得一个请求,该请求返回选定年份列表中的结果(可能不是连续的,我们可能有2010年和2012年没有2011年)。

我有什么方法可以实现这一目标?

4 个答案:

答案 0 :(得分:1)

你可以在where方法

中尝试一些SQL
Table.where(
  'created_at between ? and ? or created_at between ? and ?', 
  date1,
  date2,
  date3,
  date4
)

另外,作为调试这些查询的有用提示。获得查询后,可以调用to_sql查看文字SQL结果。

User.where(admin: true).to_sql

答案 1 :(得分:1)

使用Arel

t = User.arel_table

results = User.where(t[:created_at].gt( '2010-01-01').and(t[:created_at].lt('2010-12-01')).
or(t[:created_at].gt('2012-01-01').and(t[:created_at].lt('2012-12-31'))))

答案 2 :(得分:0)

使用any_of gem:

Table.where.any_of(Table.where(created_at: t1..t2), Table.where(created_at: t3..t4))

t1,t2,t3和t4,是日期。

答案 3 :(得分:0)

我更喜欢使用:

where('created_at > ? AND created_at < ? OR created_at > ? AND created_at < ?', Time.new(2010,1,1), Time.new(2010,12,1), Time.new(2010,1,1), Time.new(2012,1,1), Time.new(2012,12,31))