2013-08-02 36 views
0

我有一個Rails 3.2應用程序,它帶有一個日期字段的Article模型。我想創建一個範圍,它將檢索上個月的所有記錄。我遇到的問題是我目前的範圍不包括本月的第一天。Rails:創建上個月的範圍

# 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') 

當我看到實際效果,只用的2013年7月2日的日期的文章開始。

但是,如果我的代碼更改爲:

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

似乎是一個時區的問題。您的導軌時區設置爲?和數據庫? –

+0

我的Rails設置爲'config.time_zone ='太平洋時間(美國和加拿大)'',我不確定如何檢查我的數據庫設置爲什麼。 – yellowreign

+0

可您嘗試追加UTC到1.month.ago.beginning_of_month和1.month.ago.end_of_month 像 1.month.ago.beginning_of_month.utc..1.month.ago.end_of_month.utc –

回答

1

除非您另有指定,否則ActiveRecord會自動轉換爲UTC。您需要將範圍轉換爲UTC。

def self.last_month_range 
    1.month.ago.utc.beginning_of_month..1.month.ago.utc.end_of_month 
end 
+0

謝謝你工作! – yellowreign

+0

這是越野車。正確的解決方案如下。 – Jared

1

我得到了公認的答案被蟲咬:

Time.now.utC# => 2015-05-01 01:18:57 UTC 

1.month.ago.utc.beginning_of_month #=> 2015-03-01 00:00:00 UTC 

的問題是,時間被轉換爲UTC月份減去之後。

這裏有一個正確的解決辦法:

def self.last_month_range 
    Time.now.utc.prev_month.beginning_of_month..Time.now.utc.prev_month.end_of_month 
end