Ruby on rails RubyonRails noob命名为带有日期时间的_范围

Ruby on rails RubyonRails noob命名为带有日期时间的_范围,ruby-on-rails,Ruby On Rails,我是一名.net开发人员,因为5年前我上过一门课,所以得到了一个RubyonRails应用程序。我真的是一个新手,在了解这个应用程序,但我想我已经发现我的问题,现在我需要帮助,以找出如何解决它 我有一个时间表,显示审计和这些审计计划的时间段 在计划中_controller.rb @audits = Audit.after(Date.yesterday).before(Date.tomorrow).not_canceled.find_all_by_user_id(params[:id]) 在au

我是一名.net开发人员,因为5年前我上过一门课,所以得到了一个RubyonRails应用程序。我真的是一个新手,在了解这个应用程序,但我想我已经发现我的问题,现在我需要帮助,以找出如何解决它

我有一个时间表,显示审计和这些审计计划的时间段

在计划中_controller.rb

@audits = Audit.after(Date.yesterday).before(Date.tomorrow).not_canceled.find_all_by_user_id(params[:id])
在audit.rb模型中,我有两个命名作用域

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'"}}
named_scope:after,lambda{date}{:conditions=>“date_time>”{date}23:59:00.000'}
命名为_scope:before,lambda{date{:conditions=>“date{date}00:00:00.000”

数据库中的日期时间存储在utc时间,因此,当显示今天的所有审核时,当天晚些时候的审核将丢失。例如(在EST中),如果我今天晚上7:30有一个审计,由于5个小时的差异,它会存储在明天日期的数据库中。有没有关于如何纠正这个问题的建议?该应用程序位于rails 2.3.5中。谢谢

您可以将时间对象传递到范围中,而不是传递到日期中,以便更准确。这样做时,你必须意识到时区:

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]}}
如果在
config/environment.rb
中,您已经定义了

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

或所需时区,您不必执行代码中的第一行(
time.zone=“东部时间(美国和加拿大)”
)。要获取美国的时区,可以使用
rake time:zones:US
。(对于所有时区,都是
rake time:zones:all

谢谢,这正是我想要的!
config.time_zone = 'Eastern Time (US & Canada)'