我的ActiveRecord
模型标准为created_at
,updated_at
个时间戳。我想运行一个查询来查找在一个时间范围内创建或更新的所有记录。
可以在单个ActiveRecord查询中执行此操作吗?
以下内容适用于单个子句(例如,仅查询created_at
)。
range = 2.weeks.ago .. 1.week.ago
=> Mon, 03 Jun 2013 14:49:54 UTC +00:00..Mon, 10 Jun 2013 14:49:54 UTC +00:00
Item.where(:created_at => range)
Item Load (0.4ms) SELECT `items`.* FROM `items` WHERE (`items`.`created_at` BETWEEN '2013-06-16 14:40:55' AND '2013-06-17 14:40:55')
=> [... results ...]
当我尝试添加第二个句子时,ActiveRecord
正在生成一个AND
语句,这不是我想要的:
Item.where(:created_at => range, :updated_at => range)
SELECT `items`.* FROM `items`
WHERE (`items`.`created_at` BETWEEN '2013-06-16 14:40:55' AND '2013-06-17 14:40:55')
AND (`items`.`updated_at` BETWEEN '2013-06-16 14:40:55' AND '2013-06-17 14:40:55')
我可以使用单个语句进行查询,并将结果添加到一个集合中以删除重复项,但它确实感觉像是一次可能的查询。
和想法?
答案 0 :(得分:3)
通过搜索created_at
AND updated_at
,您的代码过于复杂。您只需要搜索updated_at
,因为它也会在创建时设置。所以你的问题的解决方案是:
range = 2.weeks.ago .. 1.week.ago
Item.where(:updated_at => range)
答案 1 :(得分:2)
如果你想要OR
两个条件,你必须写自己的陈述:
Item.where("(created_at BETWEEN ? AND ?) or (updated_at BETWEEN ? and ?)", 2.weeks ago, 1.week ago, 2.weeks_ago, 1.week_ago)
答案 2 :(得分:0)
查看gem "squeel"
它一定会帮到你。它非常棒。关于此的轨道广播也在那里: