результат запроса преобразуется в строку вместо даты - PullRequest
0 голосов
/ 15 мая 2019
activerecord 4.2.11.1
activerecord-jdbc-adapter 1.3.25
activerecord-jdbcpostgresql-adapter 1.3.25
jdbc-postgres 9.4.1206

Следующий вызов метода возвращает Date при использовании ruby ​​2.3.3 , но возвращает String при использовании JRuby-9.1.17.0 с activerecord-jdbcpostgresql-adapter:

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. Эта ошибка не возникает с той же версией activerecord-jdbc-adapter, если используется Active Record 4.0 или 4.1. Обновление до последней версии jruby-9.2.7.0 также не помогло.

Ответы [ 2 ]

1 голос
/ 17 мая 2019

похоже на ошибку совместимости в AR-JDBC, на данный момент, скорее всего, не будет исправлено, так как AR 4.2 также не поддерживается.

вам следует попробовать обновить до 5.x, если это проблемаили попробуйте решить проблему и отправьте PR ...

в качестве крайней меры. Попробуйте установить ActiveRecord::ConnectionAdapters::JdbcConnection.raw_date_time = true (хотя я думаю, что он уже true при работе на AR 4.2)

0 голосов
/ 05 июня 2019

как заметил @kares, это похоже на ошибку, также это относится к конфигурации ActiveRecord::ConnectionAdapters::JdbcConnection.raw_date_time.Кажется, что если он установлен в true, вызов метода ниже возвращает строку, в противном случае он возвращает экземпляр времени:

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 гем 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
...