环境:Rails 2.2.2、Oracle 10g
在我的 ActiveRecord 模型中声明为“日期”的大多数列都是这样的:日期:它们根本不关心时间。
所以使用这样声明的模型:#
class MyDateOnlyModel < ActiveRecord::Migration
def self.up
create_table :my_date_only_model do |t|
t.date :effective_date
t.timestamps
end
end
end
编写这样的测试:
test_date = Date.new(2008,12,05)
MyDateOnlyModel.create!(:effective_date => test_date)
assert_equal test_date, MyDateOnlyModel.find(:first).effective_date
应该通过,不是吗?(当然,假设我在转录上述内容时没有搞砸任何事情)
但它没有——不完全是。我明白了:
<Fri, 05 Dec 2008> expected but was
<Fri, 05 Dec 2008 00:00:00 UTC +00:00>.
所以我在数据库中输入了一个日期并得到了……我得到了什么?
puts MyDateOnlyModel.find(:first).eff_date.class
告诉我我实际上得到了一个ActiveSupport::TimeWithZone
. 这根本不是我想要的。
有没有一种简单的方法来告诉 ActiveRecord 一些(不是所有)列是Date
s 并且只有Date
s?
更新:更多抱怨...
是的,我可以使用 to_date:
assert_equal test_date, MyDateOnlyModel.find(:first).effective_date.to_date
工作正常。但这就是我试图避免的。我让 AR 让我约会,我想要约会回来。
我可以在我的类中添加一个方法, Effective_date_as_date - 这也有效。但肯定不是不可能约会,dagnabbit。
接受前更新
最终我意识到为什么这是 Oracle 的一个特殊问题:DATE 和 DATETIME 之间没有区别,因此 ActiveRecord 无法单独判断零时间是指午夜(可能带有时区更正)还是只是日期。呸。愚蠢的甲骨文。所以我要么沿着插件路线走,改变我的数据库(很诱人,非常诱人),要么继续我目前的 to_date/to_time 混乱。