rake db:迁移不推动迁移

时间:2014-03-21 19:05:22

标签: ruby-on-rails

我正在使用教程学习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文件没有被修改。

我已经得出结论,迁移由于某种原因没有通过,但不知道为什么。有什么明显的东西我做错了吗?谢谢你的帮助。

3 个答案:

答案 0 :(得分:6)

未获取更改的原因是您正在修改版本号小于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应该接受此更改。

答案 1 :(得分:0)

如果您发现迁移文件有与之关联的时间戳。这就是Rails如何跟踪已经运行的迁移的方式。

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

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

答案 2 :(得分:0)

如果您之前运行过迁移,则无法再次运行。 Rails会跟踪已应用的迁移,并且仅在您rake db:migrate时才会运行新的迁移。

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

每次要对db进行更改时都会生成新的迁移,请进行所需的更改,然后运行它:

rails g migration my_migration

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

相关问题