【问题标题】:Preventing Rails 4 migration from changing timestamp to datetime?防止 Rails 4 迁移将时间戳更改为日期时间?
【发布时间】:2013-08-13 20:57:18
【问题描述】:

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

例如

t.timestamp "column_name", limit: 6,

当我这样做时

rake db:migrate RAILS_ENV=test

sql中的时间戳列发生了变化:

`column_name` datetime(6)

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

【问题讨论】:

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


    【解决方案1】:

    好吧,就 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
    

    【讨论】:

    • mysql 5.1 怎么样?
    【解决方案2】:

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

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

    t.column "column_name", "timestamp"
    

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-14
      • 1970-01-01
      • 1970-01-01
      • 2017-06-04
      相关资源
      最近更新 更多