为什么直接更改迁移文件不会更改架构文件?

时间:2014-06-20 09:01:49

标签: ruby-on-rails ruby

我当前的迁移文件是

class CreateMovies < ActiveRecord::Migration
  def up
    create_table :movies, :force => true do |t|
      t.string :title
      t.string :rating
      t.text :description
      t.datetime :release_date
      # Add fields that let Rails automatically keep track
      # of when movies are added or modified:
      t.timestamps
    end
  end

  def down
    drop_table :movies
  end
end

我尝试将release_date类型更改为整数。所以我直接将文件更改为

class CreateMovies < ActiveRecord::Migration
  def up
    create_table :movies, :force => true do |t|
      t.string :title
      t.string :rating
      t.text :description
      t.integer :release_date
      # Add fields that let Rails automatically keep track
      # of when movies are added or modified:
      t.timestamps
    end
  end

  def down
    drop_table :movies
  end
end

请注意,release_date类型已更改。但是在我运行之后

  

捆绑exec rake db:migrate

它仍然生成与以前相同的模式文件。我很困惑。

3 个答案:

答案 0 :(得分:3)

可能是因为您已经运行了迁移。所以在你想要改变它之前,你应该首先回滚它:

bundle exec rake db:rollback

然后你应该修改它并再次运行:

bundle exec rake db:migrate

答案 1 :(得分:1)

作为删除和增加迁移的替代方法,您可以进行新迁移以更改列类型。

class ChangeMoviesReleaseTypeToInteger < ActiveRecord::Migration
  def up
    change_column :movies, :release_date, :integer
  end

  def down
    change_column :movies, :release_date, :datetime
  end
end

正如旁注,release_date是一个整数字段的令人困惑的名称 - 大多数人都希望它是你原来的日期时间。

答案 2 :(得分:0)

向下将删除表格

  

rake db:migrate:down VERSION = file_name(不包括扩展名)

向上将创建新的更改

rake db:migrate:up VERSION=file_name(exclude extension)