Я столкнулся с этой идиосинкразией, проверяя свои проверки. С миграцией, определенной следующим образом:
create_table :time_windows do |t|
t.datetime :window_begin, :null => true
t.datetime :window_end, :null => true
end
в ирб
>> t = TimeWindow.new({:window_begin => Time.now, :window_end => "not a time"})
=> #<TimeWindow id: nil, window_begin: "2010-07-29 15:54:07", window_end: nil>
Мой вопрос: почему ActiveRecord интерпретирует «не время» как nil, а не просто устанавливает :window_end = «не время»? Тот же самый перевод в ноль происходит, когда вы также устанавливаете :window_end в int.
Причина, по которой это проблема для меня, заключается в том, что если кто-то попытается сохранить значение, отличное от времени, в столбце :window_end (или :window_start), я бы хотел, чтобы возникла ошибка, но здесь это не так.
Спасибо.