Среда: 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, который у меня есть в настоящее время.