8

例如我有这个模型:

class Product < ActiveRecord::Base
  attr_accessible :name, :order
end

然后当我这样做时,rake db:migrate它创建了这个db/migrate/20120825132038_create_products.rb

class CreateProducts < ActiveRecord::Migration
  def change
    create_table :products do |t|
      t.integer :order
      t.string :name

      t.timestamps
    end
  end
end

但这一切都发生了,因为我用过rails generate Product order:integer name:string

现在,在我转到产品模型并手动将其更改为:

class Product < ActiveRecord::Base
  attr_accessible :name, :order, :category_id

  validates :name, uniqueness: true
  belongs_to :category
end

如何使用更新自动更新db/migrate/20120825132038_create_products.rb

4

2 回答 2

17

当你运行rake db:migrate时,它没有创建db/migrate/20120825132038_create_products.rb。该迁移文件是在您运行时创建的

rails generate Product order:integer name:string

attr_accessible与迁移数据库无关。

我强烈建议您阅读 Rails Guide on Migrations以及讨论的Mass Assignmentattr_accessible部分。

要生成一个的迁移文件(因为您的问题中提到的文件已经被rake db:migrate您提到运行的上一个命令处理),运行

rails g migration AddCategoryIdToProduct category_id:integer

这应该会生成一个新的迁移,其内容如下

class AddCategoryIdToProduct < ActiveRecord::Migration
  def change
    add_column :products, :category_id, :integer
  end
end

现在再次运行rake db:migrate将处理此迁移文件,将新的category_id整数列添加到您的products表中。

于 2012-08-25T13:24:30.477 回答
7

您可以通过运行重做迁移

rake db:migrate:up VERSION=20121031143418 #insert the timestamp on migration

您还可以重做迁移(上下运行,但仅在上下运行时才有效,当您进行更改时不会这样做)

rake db:migrate:redo
于 2012-10-31T14:55:02.733 回答