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?
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.
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