我有一个带有文章模型的Rails 3.2应用程序,该模型具有日期字段。我想创建一个范围来检索上个月的所有记录。我遇到的问题是我目前的范围不包括当月的第一天。
# article.rb
scope :last_month, lambda { { conditions: { date: last_month_range } } }
private
def self.last_month_range
1.month.ago.beginning_of_month..1.month.ago.end_of_month
end
当我运行它时,它会这样做:
SELECT * FROM 'articles' WHERE ('articles`.'date' BETWEEN '2013-07-01 07:00' AND '2013-08-01 06:59:59')
当我查看实际结果时,它只会以日期为07-02-2013的文章开头。
但是,如果我将代码更改为:
def self.last_month_range
(1.month.ago.beginning_of_month - 1.day)..1.month.ago.end_of_month
end
这样做:
SELECT * FROM 'articles' WHERE ('articles`.'date' BETWEEN '2013-06-30 07:00' AND '2013-08-01 06:59:59')
在这种情况下,它会提取日期为2013年6月31日的文章。
有人可以推荐修复吗?谢谢!
答案 0 :(得分:1)
除非您另行指定,否则ActiveRecord会自动将转换为UTC。您需要将范围转换为UTC。
def self.last_month_range
1.month.ago.utc.beginning_of_month..1.month.ago.utc.end_of_month
end