查询结果将转换为字符串而不是日期

时间:2019-05-15 02:12:00

标签: ruby-on-rails-4 jdbc activerecord jruby jrubyonrails

activerecord 4.2.11.1
activerecord-jdbc-adapter 1.3.25
activerecord-jdbcpostgresql-adapter 1.3.25
jdbc-postgres 9.4.1206

以下方法调用在使用 ruby​​ 2.3.3 时返回日期,但是在将 JRuby-9.1.17.0 与activerecord-jdbcpostgresql-adapter一起使用时返回String:

2.3.3 :017 > Table.select('now() as date').first.date
  Table Load (0.7ms)  SELECT  now() as date FROM "tables"  ORDER BY "tables"."id" ASC LIMIT 1
 => 2019-05-17 03:46:52 UTC 
jruby-9.1.17.0 :002 > Table.select('now() as date').first.date
  Table Load (2.0ms)  SELECT  now() as date FROM "tables"  ORDER BY "tables"."id" ASC LIMIT 1
 => "2019-05-17 03:48:57.572526+00" 

这仅在数据库中不存在所选属性的情况下发生:

2.3.3 :012 > Table.select(:created_at).first.created_at
  Table Load (0.6ms)  SELECT  "tables"."created_at" FROM "tables"  ORDER BY "tables"."id" ASC LIMIT 1
 => Wed, 25 Sep 2013 14:26:17 -03 -03:00 
jruby-9.1.17.0 :019 > Table.select(:created_at).first.created_at
  Table Load (0.8ms)  SELECT  "tables"."created_at" FROM "tables"  ORDER BY "tables"."id" ASC LIMIT 1
 => Wed, 25 Sep 2013 14:26:17 -03 -03:00 

使用WebRick或Tomcat 7会发生这种情况。如果使用Active Record 4.0或4.1,则使用相同版本的activerecord-jdbc-adapter不会发生此错误。升级到最新的jruby-9.2.7.0也无济于事。

2 个答案:

答案 0 :(得分:0)

似乎就像AR-JDBC中的兼容性错误一样,目前还无法解决,因为AR 4.2也不受支持。

如果这是一个问题,您应该尝试升级到5.x,或者尝试解决该问题并提交PR ...

作为最后的尝试,尝试设置ActiveRecord::ConnectionAdapters::JdbcConnection.raw_date_time = true(虽然我认为它在AR 4.2上运行时已经true

答案 1 :(得分:0)

正如@kares所指出的,这看起来像是一个错误,也与配置ActiveRecord::ConnectionAdapters::JdbcConnection.raw_date_time有关。如果将其设置为true,则似乎下面的方法调用返回一个String,否则返回一个Time实例:

Locatario.select('now() as date').first.date

我已经使用3个版本的active_record检查了此行为:

Rails 3.2
    default raw_date_time? == true
    Table.select('now() as date').first.date
        Ruby: returns String
        JRuby: returns String
Rails 4.0/4.1
    default raw_date_time? == nil
    Table.select('now() as date').first.date
        Ruby: returns Time
        JRuby: returns Time
Rails 4.2
    default raw_date_time? == true
    Table.select('now() as date').first.date
        Ruby: returns Time
        JRuby: returns String

因此,看起来像active_record >= 4.0的gem activerecord-jdbc-adapter应该使用raw_date_time = false,因为它应该返回带有相关方法调用的Time实例。作为解决方法,我在初始化程序下创建了一个包含以下内容的文件:

if RUBY_PLATFORM == "java" && Rails::VERSION::STRING.starts_with?("4.2.") 
    ActiveRecord::ConnectionAdapters::JdbcConnection.raw_date_time = false
end