我已经通过将其从现有数据库中拉出来创建了一个rails模式。所以现在我想迁移该模式,以便我可以在测试数据库上复制我的表。但是,即使我的架构和迁移文件具有带时间戳属性的表
e.g。
t.timestamp "column_name", limit: 6,
当我这样做时
rake db:migrate RAILS_ENV=test
在sql:
中更改了时间戳列`column_name` datetime(6)
我不想将列类型更改为datetime,我意识到对datetime的设置限制是mysql中的错误。有没有办法可以使用时间戳强制使用rails进行迁移?
答案 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中它仍然会出现这种情况,但它似乎仍然适用。