2

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

例如

t.timestamp "column_name", limit: 6,

当我做

rake db:migrate RAILS_ENV=test

时间戳列在 sql 中更改:

`column_name` datetime(6)

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

4

2 回答 2

3

好吧,就 ActiveRecord 而言timestamps == datetime。因此,当您调用t.timestamp它时,它会创建一个类型为datetime. AR 似乎没有使用 MYSQL 的 TIMESTAMP 数据类型。这是相关的来源

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

datetime正如您在上面可能注意到的,rails 正在使用数据类型而不是时间戳创建两列。因此您将明确指定列类型,如下所示:

t.column, :timestamp, "column_name", limit: 6
于 2013-08-13T21:23:26.983 回答
2

您应该能够定义一个将类型指定为字符串的列,它将仅在数据库中使用该类型定义,而不是对其应用任何 rails 解释。文档专栏提出了这一建议,但也警告说“......这不会与数据库无关,通常应该避免”。不过,在您的情况下,这似乎不是问题。

所以,类似下面的东西应该可以工作:

t.column "column_name", "timestamp"

这个答案也建议了这一点:Ruby/Rails - Active Record Db Migration to MySQL - timestamp type? . 我不确定更高版本的 rails 是否仍然如此,但它似乎仍然适用。

于 2013-08-13T21:13:25.573 回答