Rails将schema.rb时间戳更改为日期时间

时间:2013-03-20 15:49:11

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

与其他开发人员合作时,这个问题似乎一直存在。我们有一个像这样的迁移创建的表(由postgres支持):

create_table :subscription_events do |t|
  t.integer :subscriber_id
  t.text :source_url
  t.text :params
  t.text :session

  t.timestamps
end

然后在运行rake db:migrate之后的未来看似随机的时间点,Rails想要更新schema.rb文件以使用datetime而不是timestamp,导致另外令人困惑的重新注册整个create_table调用也是:

   create_table "subscription_events", :force => true do |t|
-    t.integer   "subscriber_id"
-    t.text      "source_url"
-    t.text      "params"
-    t.text      "session"
-    t.timestamp "created_at",    :limit => 6, :null => false
-    t.timestamp "updated_at",    :limit => 6, :null => false
+    t.integer  "subscriber_id"
+    t.text     "source_url"
+    t.text     "params"
+    t.text     "session"
+    t.datetime "created_at",    :null => false
+    t.datetime "updated_at",    :null => false
   end

造成这种情况的原因是什么?我们应该检查这个修改过的文件还是每次都重置一次?

1 个答案:

答案 0 :(得分:10)

这不应该导致任何“重新索引”,因为:datetime:timestamp迁移类型都映射到PostgreSQL的TIMESTAMP数据类型。

这可能是由于固有的无序ActiveRecord::ConnectionAdapters::PostgreSQLAdapter::NATIVE_DATABASE_TYPES常量导致的,该常量被定义为标准哈希。当ActiveRecord搜索“TIMESTAMP”的第一个合适匹配时,它可能会发现:datetime:timestamp不可预测(因为两者都匹配)。

简而言之,不要大惊小怪,因为这不应该影响您的数据或架构。

<强>更新

使用simplified_type方法找到转储中使用的rails“数据类型”,该方法将为TIMESTAMP数据类型返回:datetime。更有可能的是,您已升级了Rails版本,其中先前版本具有用于确定数据类型的不同方法。不管是什么原因,这不应该以任何方式影响你。