查找在时间范围内创建或更新的ActiveRecord对象

时间:2013-06-17 14:54:37

标签: sql ruby-on-rails activerecord

我的ActiveRecord模型标准为created_atupdated_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')

我可以使用单个语句进行查询,并将结果添加到一个集合中以删除重复项,但它确实感觉像是一次可能的查询。

和想法?

3 个答案:

答案 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"它一定会帮到你。它非常棒。关于此的轨道广播也在那里:

https://github.com/ernie/squeel

http://railscasts.com/episodes/354-squeel?view=asciicast