0

环境: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 一些(不是所有)列是Dates 并且只有Dates?

更新:更多抱怨...

是的,我可以使用 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 混乱。

4

2 回答 2

1

您是否尝试过将属性转换为 Date 类型?

API 对 to_date 的描述如下:

将 self 转换为 Ruby Date 对象;时间部分被丢弃

test_date = Date.new(2008,12,05)
MyDateOnlyModel.create!(:effective_date => test_date)
assert_equal test_date, MyDateOnlyModel.find(:first).effective_date.to_date

更新

增强型 Oracle 适配器

看起来这个适配器可能会解决您的问题...

设置下面的选项,因此名称中带有 DATE 的列将被模拟为日期(而不是时间,这是数据库中 DATE 列的默认值)

ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = true
于 2008-12-08T15:35:00.393 回答
1

我发现了一个错误:您无法将 TimWithZone 与日期进行比较。比较失败,红宝石告诉我。

于 2009-01-12T18:36:51.143 回答