我有一个带有Planning属性的模型start_time
假设我想得到所有上午9点到12点或下午6点到11点之间的计划。
基本上我会:

Planning.where do
     (start_time >= @start_time[0]) & (start_time <= @end_time[0])
     |
     (start_time >= @start_time[1]) & (start_time <= @end_time[1])
end

问题是时隙的数量不同…有什么想法吗?
如果可以的话,我用橡皮膏。
提前谢谢!

最佳答案

您可以在where块中做任何您想做的事情;但是您必须在最后返回实际的查询,因为这将被用作where子句。
所以,假设有一系列这样的时间:

times = [ [ '09:00:00', '12:00:00' ], [ '18:00:00', '23:00:00' ] ]

以下是详细的解决方案:
Planning.where do
  query = nil

  times.each do |a,b|
    q = (start_time >= a) & (end_time <= b)

    if query
      query |= q
    else
      query = q
    end
  end

  query
end

下面是一个更聪明的解决方案:
Planning.where do
  times.map { |a,b| (start_time >= a) & (end_time <= b) }.reduce(&:|)
end

两者都会生成以下SQL:
SELECT "plannings".* FROM "plannings"
WHERE ((
  ("plannings"."start_time" >= '09:00:00' AND "plannings"."end_time" <= '12:00:00')
  OR
  ("plannings"."start_time" >= '18:00:00' AND "plannings"."end_time" <= '23:00:00')
))

10-07 19:03