查询去年数据的范围

时间:2014-02-12 22:43:17

标签: ruby ruby-on-rails-3 activerecord

我编写了一个范围,该范围从当前年份的开头到当年年底返回带有transfer_date的所有对象。

scope :year, lambda { where("transfer_date BETWEEN ? AND ?", Time.zone.now.beginning_of_year, Time.zone.now.end_of_year) }

这很好用,并给了我需要的对象。但是现在我正在寻找一个能够做同样事情的范围但是前一年。我知道在Begin_of_last_year的Time类中没有方法,所以我认为定义类方法而不是范围可能更好。

如果我想要返回所有具有去年年初和去年年底之间的对象,那么在Ruby中表达这一点的最佳方法是什么?

我已将此作为范围编写,但我认为它可以更清晰:

scope :previous_year, lambda {where("transfer_date BETWEEN ? AND ?", Time.zone.now.beginning_of_year - 1.year, Time.zone.now.end_of_year - 1.year)}

3 个答案:

答案 0 :(得分:3)

我在这里做了一些优化。

由于您已经加载了ActiveSupport并且正在使用它,因此请使用ago方法,并编写更灵活的内容。您还可以使用范围,ActiveRecord可以处理为您的数据库编写适当的查询,不需要字符串替换。

scope :from_year, ->(date) { where(transfer_date: date.beginning_of_year..date.end_of_year) }

# usage
Record.from_year(1.year.ago)

这不那么僵硬。您现在可以轻松查询5年前的记录,而无需编写任何新代码。如果你发现自己去年在很多地方使用过,那么请使用它:

def self.last_year
  from_year 1.year.ago
end

答案 1 :(得分:2)

这个怎么样:

(Time.zone.now - 1.year).beginning_of_year
(Time.zone.now - 1.year).end_of_year

答案 2 :(得分:0)

我使用这行代码

scope :last_year, lambda {where(transfer_date: 1.year.ago.all_year)}

irb(main):032:0> 1.year.ago.all_year
=> Thu, 01 Jan 2015 00:00:00 UTC +00:00..Thu, 31 Dec 2015 23:59:59 UTC +00:00