我有一个带有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')
))