Update db/migrate after manually updating models?

2019-03-13 17:36发布

问题:

For example i have this model:

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

Then when i did rake db:migrate it created this 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

But it all happend cuz i used rails generate Product order:integer name:string

Now after i go to Product model and changes it manually to:

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

  validates :name, uniqueness: true
  belongs_to :category
end

How can i auto update the db/migrate/20120825132038_create_products.rb with the updates?

回答1:

When you ran rake db:migrate, it did not create db/migrate/20120825132038_create_products.rb. That migration file was created when you ran

rails generate Product order:integer name:string

attr_accessible has nothing to do with migrating your database.

I strongly recommend you read the Rails Guide on Migrations, as well as the section on Mass Assignment which discusses attr_accessible.

To generate a new migration file (since the one mentioned in your Question has already been processed by the previous rake db:migrate command you mentioned running), run

rails g migration AddCategoryIdToProduct category_id:integer

This should generate a new migration with contents like

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

Running rake db:migrate again now will process this migration file, adding the new category_id integer column to your products table.



回答2:

You can redo a migration by running

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

You can also redo a migration (runs up and down, but only works if you have an up and down, which you won't when you just have a change)

rake db:migrate:redo