【问题标题】:rake db:migrate not pushing migrations throughrake db:migrate 不推动迁移通过
【发布时间】:2014-03-21 19:05:21
【问题描述】:

我正在使用教程学习 Rails,在 Nitrous.io 中工作,并修改了我的迁移文件以创建模型之间的关系。这是一个简单的时间跟踪应用程序。修改后的迁移文件之一的示例如下:

class CreateWorks < ActiveRecord::Migration
  def change
    create_table :works do |t|
      t.integer :project_id
      t.integer :user_id
      t.datetime :datetimeperformed
      t.decimal :hours, precision: 5, scale: 2
      t.timestamps
    end
  end
end

项目 id、用户 id、datetimeperformed 和 hours 都是新的,但是当我运行 rake db:migrate 将它们推送到 schema.rb 时,什么也没有发生。它暂停,然后给我一个新的提示,但 schema.rb 文件没有被修改。

我得出的结论是由于某种原因没有进行迁移,但不知道为什么。有什么明显的我做错了吗?感谢您的帮助。

【问题讨论】:

  • 尝试 .float 而不是 .decimal
  • 如果您只想更改架构,您可以尝试 rake db:schema:dump。但是,如果您已经应用了迁移,那么如果您更改了迁移文件,则 db:migrate 将不会应用更改。您可以回滚并重新应用迁移,但我不确定这是一个很好的做法。

标签: ruby-on-rails


【解决方案1】:

更改未得到采纳的原因是您正在修改现有迁移,其版本号小于您的 schema.rb 的版本号。

如果您想将列添加到现有表中,您可以创建一个新的迁移:

rails g migrate add_project_user_performance_datetime_to_work

这将为您提供db/migrate/...add_project_user_performance_datetime_to_work.rb 中的文件。修改此文件以在此处定义列。

class AddProjectUserPerformanceDatetimeToWork < ActiveRecord::Migration
  def change
    add_column :works, :project_id, :integer
    add_column :works, :user_id, :integer
    add_column :works, :datetimeperformed, :datetime
  end
end

然后运行 ​​rake db:migrate 应该会接受此更改。

【讨论】:

    【解决方案2】:

    如果您注意到您的迁移文件有一个与之关联的时间戳。这就是 Rails 跟踪哪些迁移已经运行的方式。

    当您重新运行 rake db:migrate 时,旧的迁移将不会运行。您需要做的是创建一个新的迁移,其中包含您想要对现有表进行的更改并运行 rake db:migrate

    如果您运行rake db:migrate:status,它将显示哪些迁移文件已执行,哪些尚未执行。确保不要更改旧的迁移文件,除非您有充分的理由这样做。

    【讨论】:

      【解决方案3】:

      如果您之前运行过迁移,它将不会再次运行。 Rails 会跟踪已应用的迁移,并且只会在您rake db:migrate 时运行新的迁移。

      要检查这一点,您可以运行 rake db:migrate:status 以列出所有迁移及其状态。

      每次你想对数据库进行更改时都会生成一个新的迁移,进行你需要的更改,然后运行它:

      rails g migration my_migration
      

      您还可以通过回滚来更改已应用的现有迁移,如下所述:http://guides.rubyonrails.org/migrations.html#changing-existing-migrations

      【讨论】:

        猜你喜欢
        • 2017-02-05
        • 2017-01-07
        • 1970-01-01
        • 2012-03-12
        • 1970-01-01
        • 2014-06-20
        • 1970-01-01
        • 2010-09-09
        • 2012-01-27
        相关资源
        最近更新 更多