为什么Rails将String保存为null到日期时间列?

时间:2010-07-29 16:12:36

标签: ruby-on-rails activerecord rails-migrations

我在测试验证时遇到了这种特质。迁移定义如下:

create_table :time_windows do |t|
  t.datetime :window_begin, :null => true
  t.datetime :window_end, :null => true
end

in irb

>> 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 =“not a time”?当你将window_end设置为int时,会发生相同的translation-to-nil。

这对我来说是个问题的原因是如果有人试图在:window_end(或:window_start)列中保存非Time值,我想要抛出一个错误,但这不是这里的情况。

感谢。

1 个答案:

答案 0 :(得分:1)

首先,数据库无法在datetime列中保存字符串。其次,Rails将“不是时间”解释为零,因为你没有时间价值,即你没有时间。

最后,您有责任验证您的输入。你可以这样做:rails built in datetime validation