gpt4 book ai didi

ruby-on-rails - 如何强制 Rails 将 Oracle 日期字段视为日期时间?

转载 作者:行者123 更新时间:2023-12-05 06:36:06 24 4
gpt4 key购买 nike

我的问题

Oracle“DATE”列实际上也存储时间,只是精度低于“TIMESTAMP”(秒对皮秒)。我需要我的应用程序与这个遗留模式交互,就好像日期是一个日期时间一样。因为 Rails 将此字段视为日期,所以它会截断时间。

示例:

2.4.1 :003 > m.send_after_ts = Time.now
=> 2018-03-15 11:45:50 -0600
2.4.1 :004 > m.send_after_ts
=> Thu, 15 Mar 2018

配置数据:

#columns 的结果:

#<ActiveRecord::ConnectionAdapters::OracleEnhancedColumn:0x00000005501658
@collation=nil,
@comment=nil,
@default=nil,
@default_function=nil,
@name="send_after_ts",
@null=true,
@object_type=false,
@returning_id=false,
@sql_type_metadata=
#<ActiveRecord::ConnectionAdapters::SqlTypeMetadata:0x00000005501720
@limit=nil,
@precision=nil,
@scale=nil,
@sql_type="DATE",
@type=:date>,
@table_name="mail",
@virtual=false>,

版本:

ruby 2.4.1p111 (2017-03-22 revision 58053) [x86_64-darwin17]
Rails 5.1.5
activerecord (5.1.5)
activerecord-oracle_enhanced-adapter (1.8.2)
ruby-oci8 (2.2.5.1)

我假设某处必须有一个映射来管理这种关系?如何让 Rails 将此字段作为时间戳?

更新

向我的模型添加 attribute :send_after_ts, :datetime 允许 Rails 将该字段视为日期时间,但在尝试写入数据库时​​会导致异常:

SQL (4.4ms)  INSERT INTO "MAIL" ("SEND_AFTER_TS", "ID") VALUES (:a1, :a2)  [["send_after_ts", "2018-03-15 12:58:02.635810"], ["id", 6778767]]
ActiveRecord::StatementInvalid: OCIError: ORA-01830: date format picture ends before converting entire input string: INSERT INTO "MAIL" ("SEND_AFTER_TS", "ID") VALUES (:a1, :a2)
from (irb):3

我假设这是由额外的精度(小数秒)引起的,但我没有看到将其定义为属性设置的一部分的方法。

我现在可以通过将这个字段写成字符串来解决这个问题,例如:

2.4.1 :013 > m.send_after_ts = Time.now.to_s
=> "Mar 15, 2018 12:48"
2.4.1 :014 > m.save
=> true

我仍在寻找真正的解决方案。

最佳答案

你可以使用虚拟属性模式作为你的接口(interface):

def send_after_ts_datetime
send_after_ts.to_datetime
end

def send_after_ts_datetime=(datetime)
self.send_after_ts = datetime.to_s
end

现在您将使用 _datetime 方法读取和写入属性,但您的数据将存储在原始的 send_after_ts 列中。

>> m.send_after_ts_datetime = Time.now
#> "2018-03-15 15:15:49 -0600"

>> m.send_after_ts_datetime
#> Thu, 15 Mar 2018 15:15:49 -0600

关于ruby-on-rails - 如何强制 Rails 将 Oracle 日期字段视为日期时间?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49306183/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com