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

发布于 2024-09-11 15:10:57 字数 626 浏览 4 评论 0原文

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

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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

隔纱相望 2024-09-18 15:10:57

首先,数据库无法在日期时间列中保存字符串。其次,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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文