2011-07-03 15 views
13

所以我想要做的事情,像這樣:一個日期到datetime Created_at在Rails3中比較

today = Date.today - 1 
todaysReport = Report.where(:created_at => today).find_by_user_id(user.id) 

的問題是created_at是一個日期,這樣就不會找到任何matches..Any建議?

+0

在Heroku Postgres的 – Elliot

+1

'Date.today - 1'將評估爲* *昨天。刪除'-1'或將「今天」的三個實例更改爲「昨天」 –

回答

20

你可能想是這樣的:

yesterday = Time.now - 1.day 
user = User.find(user_id) 

todaysReport = user.reports.where(["created_at >= ? AND created_at <= ?", yesterday.beginning_of_day, yesterday.end_of_day]) 
+0

其解決方案,但一個不好的解決方案... –

+0

我已經更新了我的答案。 – Dex

+0

嗯...更好:) –

-4

您是否嘗試過使用#to_datetime,其中Rails添加到DateTime類?

Report.where(:created_at => today.to_datetime).find_by_user_id(user.id) 

實際上驚訝的AR不會爲您處理這個。

+0

當我只是想匹配一天的時候,它不會試圖匹配嗎? – Elliot

+0

唯一的問題是他可能實際上需要一個範圍,這就是爲什麼它不起作用。 AR現在不應該產生錯誤。 – Dex

+0

啊,是的,我看到了問題。 – d11wtq

5

您需要對比從一個午夜到另一個的範圍。 此外,這是一個很好的候選人,可以讓您自己的班級方法 獲得更高的靈活性。

class Report 
    # All reports created on the specified Date 
    def self.created_on(date) 
    where(['created_at >= ? AND created_at < ?', date, date + 1]) 
    end 
end 

# Find all reports created yesterday by our user 
Report.created_on(Date.today - 1).where(:user_id => user.id) 
+0

我喜歡這一點!我應該將beginning_of_day和end_of_day添加到日期變量中,但是對嗎? – Elliot

+0

@Elliot:沒有必要。日期將被轉換爲日期時間,並將時間部分設置爲幕後的午夜。 –

1

如果在應用程序配置中指定時區,它也可以是TimeWithZone。要將日期轉換爲TimeWithZone,您必須像Date.today.to_time.in_time_zone一樣進行操作。