2011-11-10 121 views
2

我是一名.NET開發人員,因爲我在5年前上過一門課,所以在rails應用程序上交了一個ruby。我真的是理解這個應用程序的新手,但我認爲我現在發現我的問題,我需要幫助來弄清楚如何解決它。Ruby on Rails noob named_scope with datetime

我有一個時間表,表明審計和時隙的審計計劃英寸

在audit.rb模型schedules_controller.rb

@audits = Audit.after(Date.yesterday).before(Date.tomorrow).not_canceled.find_all_by_user_id(params[:id]) 

我有2米命名範圍

named_scope :after, lambda {|date| {:conditions => "date_time > '#{date} 23:59:00.000'"}} 

named_scope: before, lambda {|date| {:conditions => "date_time < '#{date} 00:00:00.000'"}} 

數據庫中的日期時間存儲在utc時間,因此,當今天的所有審計都顯示爲當天晚些時候的審計失蹤。例如(如果在美國東部時間)如果我今天晚上7點30分進行審計,則由於5小時的差異,它將存儲在明日期的數據庫中。有關如何解決此問題的任何建議?該應用程序在rails 2.3.5中。謝謝!

回答

3

您可以將時間對象傳遞到作用域而不是日期,以便它更準確。你必須意識到有關時區,而這樣做:

Time.zone = "Eastern Time (US & Canada)" 
start_time = Time.zone.parse("#{Date.today} 23:59:00") 
end_time = Time.zone.parse("#{Date.yesterday} 00:00:00") 
@audits = Audit.after(start_time)).before(end_time).not_canceled.find_all_by_user_id(params[:id]) 

和範圍應該這樣

named_scope :after, lambda {|time| {:conditions => ["date_time > ?", time]}} 
named_scope :before, lambda {|time| {:conditions => ["date_time < ?", time]}} 

這裏的關鍵是代碼Time.zone.parse將分析的時間假設這個字符串給定的改變位於上面的行指定的時區。如果我們直接使用Time.parse,它將假定服務器時鐘的時區爲時區。

這裏,Date.today也是有風險的,因爲它在服務器機器的時區給出了日期。有兩個Rails添加到時間對象的幫助器方法,分別爲beginning_of_dayend_of_day,它們會給出正確的時間。因此,使用它們,我們可以計算出

start_time = Time.zone.now.end_of_day - 1.day 
end_time = Time.zone.now.beginning_of_day + 1.day 

如果config/environment.rb,您已經定義,

config.time_zone = 'Eastern Time (US & Canada)' 

或所需的時區,你沒有做的第一行代碼( Time.zone = "Eastern Time (US & Canada)")。爲了在美國獲得時區,您可以使用rake time:zones:us。 (對於所有的時區,它是rake time:zones:all

+0

謝謝,這正是我一直在尋找的! – fire409