例如,我有这个模型:
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 ?
答案 0 :(得分:17)
当您运行rake db:migrate
时,没有创建db/migrate/20120825132038_create_products.rb
。您运行
rails generate Product order:integer name:string
attr_accessible
与迁移数据库无关。
我强烈建议您阅读 Migrations 上的Rails指南,以及 Mass Assignment 上讨论{{ 1}} 强>
要生成新迁移文件(因为您提出的问题中提及的文件已经由您提及的上一个attr_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
表中。
答案 1 :(得分:7)
您可以通过运行
重做迁移rake db:migrate:up VERSION=20121031143418 #insert the timestamp on migration
你也可以重做一次迁移(向上和向下运行,但只有在你有一个向上和向下的情况下才能运行,你只需要进行更改就不会有效)
rake db:migrate:redo