2011-06-04 97 views
1

我已经阅读了不少文章,完成了我的作业。我有存储为UTC所有时间,每个用户设置自己的时区,等等。这里是我遇到的问题:Activerecord:在当地时间将字符串转换为时间

Time.zone 
=> GMT-05:00 Eastern Time US Canada 

t = Ticket.first 
t.hold_until = "Jan 1, 2012 9:00PM" 
t.save! 

t.hold_until 
=> Sun, 01 Jan 2012 16:00:00 EST -05:00 

# notice the above time lost 5 hours 

的问题是,字符串是由用户提供的POST请求。假设用户输入是在他们的本地时间,而不是UTC。我错过了什么,或者不应该是ActiveRecord默认?除了必须在我的所有控制器中转换时间之外,什么是正确的方法。这似乎是错误的,而不是非常干燥。

回答

0

我想出了这个问题,它与ActiveRecord中写得不好的代码有关(惊喜!)。无论如何,ActiveRecord :: Base.define_attribute_methods通过缺少方法被懒惰地调用。我有这样的方法定义如下:

def hold_until=(value) 
    # do some stuff here 
    super 
end 

所以ActiveRecord跳过那种认为它被定义的方法。它应该没有关系,但由于它的设计不佳。 AR有多种不同的方式来根据列类型定义方法。调用超级方面的步骤,并进入一般的“write_attribute”调用。唯一的解决办法是自己转换时间。在包含模块之前,您无法调用define_attribute_methods,因为所有alias_method_chain废话。而且你不能利用他们已经编写的代码,因为它在class_eval块中。如果可能的话,我会推荐datamapper。

相关问题