防止Rails 4迁移从更改时间戳到日期时间?

时间:2013-08-13 20:57:18

标签: mysql ruby-on-rails activerecord ruby-on-rails-4 rails-activerecord

我已经通过将其从现有数据库中拉出来创建了一个rails模式。所以现在我想迁移该模式,以便我可以在测试数据库上复制我的表。但是,即使我的架构和迁移文件具有带时间戳属性的表

e.g。

t.timestamp "column_name", limit: 6,

当我这样做时

rake db:migrate RAILS_ENV=test

在sql:

中更改了时间戳列
`column_name` datetime(6)

我不想将列类型更改为datetime,我意识到对datetime的设置限制是mysql中的错误。有没有办法可以使用时间戳强制使用rails进行迁移?

2 个答案:

答案 0 :(得分:3)

好吧,就ActiveRecord而言timestamps == datetime。因此,当您致电t.timestamp时,它会创建一个类型为datetime的列。 AR似乎没有使用MYSQL的TIMESTAMP数据类型。 here is the relavent source

  def add_timestamps(table_name)
    add_column table_name, :created_at, :datetime
    add_column table_name, :updated_at, :datetime
  end

正如您在上面所述,rails正在创建两列datetime数据类型而不是时间戳。所以你将明确指定列类型:

t.column, :timestamp, "column_name", limit: 6

答案 1 :(得分:2)

您应该能够定义一个列,将该类型指定为字符串,该字符串将仅在数据库中使用该类型定义,而不是对其应用任何rails解释。 column docs建议这一点,但也警告说“......这不会与数据库无关,通常应该避免”。看来在你的情况下这不是问题。

因此,以下内容应该有效:

t.column "column_name", "timestamp"

这个答案也提出了这一点:Ruby/Rails - Active Record Db Migration to MySQL - timestamp type?。我不确定在以后版本的rails中它仍然会出现这种情况,但它似乎仍然适用。