1

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

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

在 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 将“not a time”解释为 nil 而不仅仅是设置 :window_end = “not a time”?当您将 :window_end 设置为 int 时,也会发生相同的转换为 nil。

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

谢谢。

4

1 回答 1

1

首先,数据库无法在日期时间列中保存字符串。其次,Rails 将“not a time”解释为 nil,因为您没有时间价值,即您有 nil。

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

于 2010-07-29T16:28:26.740 回答