代码之家  ›  专栏  ›  技术社区  ›  Mike Woodhouse

如何从ActiveRecord中的Oracle日期列返回日期(而不是TimeWithZone)?

  •  0
  • Mike Woodhouse  · 技术社区  · 16 年前

    环境: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和唯一 日期 S?

    更新:更多抱怨…

    是的,我可以用来约会:

    assert_equal test_date, MyDateOnlyModel.find(:first).effective_date.to_date
    

    工作良好。但这正是我想要避免的。我让AR给我安排个约会,我要回个约会。

    我可以在我的课上添加一个方法,有效日期也可以。但当然,要找个约会对象是不可能的,达格比特。

    预验收更新

    最终,我意识到这是Oracle的一个特殊问题:日期和日期时间之间没有区别,因此ActiveRecord无法独立计算时间为零是表示午夜(可能带有时区更正),还是仅表示日期。呸。愚蠢的神谕所以我要么去插件路径,改变我的数据库(很诱人,很诱人),要么继续我目前的“到日期/到时间”混乱。

    2 回复  |  直到 16 年前
        1
  •  1
  •   mwilliams    16 年前

    您是否尝试将属性强制转换为日期类型?

    API描述如下:

    将self转换为ruby日期对象; 丢弃时间部分

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

    更新 :

    Enhanced Oracle Adapter

    看起来这个适配器可能已经修复了您的问题…

    设置下面的选项,结果 名称中包含日期的列将 被模拟为日期(而不是时间 中的日期列的默认值是 数据库)

    ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = true
    
        2
  •  1
  •   user52636    16 年前

    我发现了一个错误:你不能把提姆威森和约会相比。鲁比告诉我,比较失败了。

    推荐文章