Как вернуть дату (не TimeWithZone) из столбца даты Oracle в ActiveRecord? - PullRequest
0 голосов
/ 08 декабря 2008

Среда: 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 с и только Date с?

ОБНОВЛЕНИЕ: больше жалоб ...

Да, я мог бы использовать to_date:

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

работает отлично. Но это то, чего я пытаюсь избежать. Я попросил AR назначить мне свидание, я хочу свидание.

И я мог бы добавить метод к моему классуffective_date_as_date - это тоже работает. Но, конечно же, просто невозможно получить свидание, дагнаббит.

ОБНОВЛЕНИЕ ДО ПРИНЯТИЯ

В конце концов я понял, почему это была особая проблема с Oracle: нет различий между DATE и DATETIME, поэтому ActiveRecord не может самостоятельно определить, означает ли нулевое время полночь (возможно, с исправлениями часового пояса) или только дату , Ба. Глупый Оракул. Так что мне придется либо пойти по маршруту плагина, либо изменить свою базу данных (заманчиво, очень заманчиво), либо продолжить беспорядок to_date / to_time, который у меня есть в настоящее время.

Ответы [ 2 ]

1 голос
/ 12 января 2009

Я обнаружил ошибку: вы не можете сравнить TimWithZone с датой. Сравнение не удается, говорит мне Руби.

1 голос
/ 08 декабря 2008

Вы пытались привести свой атрибут к типу даты?

API описывает to_date следующим образом:

Преобразует себя в объект 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 в базы данных)

ActiveRecord::ConnectionAdapters::OracleEnhancedAdapter.emulate_dates_by_column_name = true
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...