2012-09-07 128 views
1

我希望能夠查找在今天之前或之後創建的特定天數的條目。我有一些包含時間戳的模型。數據庫中有大約70k條記錄正在運行,所有這些都需要很長時間。如何對時間戳執行查詢?

我希望做這樣的事情

Model.find_by_updated_at(Date.today - 1) 

看來雖然這實際上的updated_at回到班時間,沒有日期;因爲它是精確到分秒,我不能這樣做

Model.find_by_updated_at(Time.now + 10000) # ten thousand seconds 

,因爲我的要求只是想找到模型改變在特定的一天。

有沒有辦法使用find來做到這一點?

我想我可以寫我自己的SQL查詢,而不是使用查找,但我不知道如何構造它來排除通過hh:mm:ss搜索,只查看日期。

回答

2

您的查詢正在尋找在特定時間創建的模型。你可能想要的東西,返回一個特定的時間之後創建的事情:

Model.where('updated_at>=?', Date.today - 1) 
範圍

也許:

Model.where('updated_at BETWEEN ? AND ?', Date.today - 1, Date.today) 

有幾種方法可以做到這一點。如果您經常這樣做,可能會發現創建可索引列DATE列會更快。

的替代方案是動態做到這一點,如:

Model.where('DATE(updated_at)=?', Date.today - 1) 

它幾乎總是可以表達你的ActiveRecord方面想要的東西,而不必訴諸編寫自己的查詢。事實上,如果你避免這種情況,最好的辦法是,除非你有一個很好的理由,這樣你的代碼才能更好地維護。

請記住,「日子」充其量是一個相當模糊的概念。如果您以UTC時間存儲數據,則應該調整開始和結束時間,否則將使用UTC 00:00:00作爲日期的開始。這可能與您的預期不符。

1

你可以創建你的模型的方法,看起來像這樣:

def self.updated_on_date(date) 
    where('updated_at BETWEEN ? AND ?', date.beginning_of_day, date.end_of_day) 
end 

然後,你可以這樣調用

Model.updated_on_date(Date.today-1)