为什么 Rails 将 String 保存为 null 到日期时间列?
我在测试我的验证时遇到了这种特质。迁移定义如下:
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 将“不是时间”解释为 nil 而不是仅仅设置 :window_end =“不是时间”?当您将 :window_end 设置为 int 时,也会发生相同的 nil 转换。
这对我来说是一个问题的原因是,如果有人尝试在 :window_end (或 :window_start)列中保存非时间值,我希望抛出一个错误,但这里不会出现这种情况。
谢谢。
I came across this idiosyncrasy while testing my validations. With a migration defined as follows:
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>
My question is, why ActiveRecord interprets "not a time" as nil rather than just setting :window_end = "not a time"? The same translation-to-nil happens when you set :window_end to an int as well.
The reason this is a problem for me is if someone tries to save a non Time value in the :window_end (or :window_start) column, I'd like an error to be thrown, but that will not be the case here.
Thanks.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
首先,数据库无法在日期时间列中保存字符串。其次,Rails 将“不是时间”解释为 nil,因为你没有时间值,即你有 nil。
最后,您有责任验证您的输入。您可以这样做: rails 内置日期时间验证
First of all database cannot save a string in a datetime column. Second, Rails interpret "not a time" as nil because you don't have time value, i.e. you have nil.
Finally, it's your responsibility to validate your input. You can do it something like this: rails built in datetime validation