【问题标题】:Ruby on Rails: why ActiveRecord uses "datetime" type instead of "timestamp" for timestamp fields?Ruby on Rails:为什么 ActiveRecord 对时间戳字段使用“datetime”类型而不是“timestamp”?
【发布时间】:2011-06-30 13:08:03
【问题描述】:
在我的数据库迁移文件中,我插入了以下行:
t.timestamps
正如我所料,创建了两列:“updated_at”和“created_at”。但是,它们的类型是“日期时间”而不是“时间戳”。
我正在使用 MySQL 和“时间戳”类型,据我所知,is designed exactly for such cases,因为它使用较少的空间并且独立于时区。
那么,为什么 Rails 3 使用“datetime”而不是“timestamp”有什么原因吗?我应该尝试解决这个问题吗?如果是,除了不使用“t.timestamps”并且每次为每个新表分别定义“updated_at”和“created_at”列之外,还有什么方法可以做到这一点?
【问题讨论】:
标签:
ruby-on-rails
activerecord
【解决方案1】:
timestamp 列的范围有限,从 1970 年开始到 2038 年结束。您可以在谷歌上搜索“Unix Millennium Bug”以获取更多信息,但这基本上是因为 unix 时间戳存储为 32 位有符号整数。时间戳以自 1970 年 1 月 1 日以来的秒数表示,并且该数字在 2038 年自动换行。因此,我通常使用 datetime,即使 timestamp 似乎是一个更简单的解决方案,尤其是在表示历史或预测数据时更远的过去或未来。
【解决方案2】:
从内存中,mysql timestamp 列类型的行为类似于updated_at,因为只要记录更新,它就会使用当前时间进行更新。
虽然这对updated_at 列很有用,但这不是created_at 所期望的行为。
此外,Rails 处理应用程序设置中指定的时区(通常应设置为 UTC),因此使用 mysql 的时间可能与其他日期时间记录不一致。