My initial command to create was:
ruby script/generate model Album title:string picture:string
description:string price:float itemType:string
Being that I forgot to put artist name I tried to go into the
migrations file, set :force => true
and added t.string :artist into the the create_table block, and then
add_index :albums, :artist after it. so the new modified version
looks like this:
looks like this:
t.timestamps
Jon
That’s not how it is supposed to work. rake db:migrate will only run
migrations higher than the current version as reported by rake
db:version. If you want to re-run that migration (assuming you haven’t
entered data yet), you can issue a rake db:rollback afterwhich you can
run rake db:migrate
add_index :albums, :artist after it. so the new modified version
t.timestamps
end
add_index :albums, :artist
end
I ran db:migrate and the changes still haven’t taken place…am I
missing something here?
Yes. Rails keeps track of which migrations have run and which ones
haven’t so running db:migrate again does nothing. You need to migrate
down one version and back up again. Rake db:migrate:redo does exactly
that if my memory is correct
So I ran rake db:migrate VERSION=0. Then I tried to view my table
structure
under the console command line, to which I got an error(as expected
since we
roll back to version 0)
I ran the rake db:migrate again and now I have my updated table.
Why do you have to rollback a version though? If you set force to true,
shouldn’t rails see this and make the change in the db structure?
Let’s say I have data(which I did) in the table, and I want to keep that
data. Rolling back to version 0 erases all records in the table, how
would
I do this without erasing all the exisiting records? Thanks for the
insight.
shouldn’t rails see this and make the change in the db structure?
Let’s say I have data(which I did) in the table, and I want to keep that
data. Rolling back to version 0 erases all records in the table, how would
I do this without erasing all the exisiting records? Thanks for the
insight.
Like I said, Rails tracks which migrations have been run and which
hasn’t. Setting :force => true is irrelevant: the migration has been
run and so rails does not look at it.
As far as preserving data goes, you didn’t have to migrate down to 0 -
you only have to go far enough to undo the migration you edited.
If that is not acceptable (because there is data in that table or
because there are other migrations in the way) then you should write a
migration that just performs the changes you want.
Fred
This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.