Nathan Beyer wrote:
> I'm attempting to write a migration that adds a foreign key column to
> a table to replace an existing attribute (a string to an object). I'd
> like to add the column, convert the existing data into a new entry on
> the foreign table and then set the foreign key value.
>
> I'm successfully able to add the column, but it doesn't seem like the
> objects mapped to the foreign table get created, as after the
> migration completes the foreign table is empty and the foreign key
> values are very large, seemingly random integers.
>
> I've tried doing Object.new + Object.save and Object.create, but
> neither seems to work. I've also tried both of those inside of a
> transaction within the 'self.up' that's marked as ':requires_new'.
>
> Any thoughts on what I might be doing wrong or how to debug this? Any
> links to examples?
>
> Thanks.
>From your project type:
script/generate migration AddForeignKeyColumnToTableName
.. or if windows ..
ruby script/generate migration AddForeignKeyColumnToTableName
The name of the migration can be anything. I like to use Capitalized
letters for each new word to describe what I'm doing the migration for.
In the case above, a migration file will be named
add_foreign_key_column_to_table_name in your migrations folder.
Go to your database migrations "migrations" folder and open the new
migration we just created so you can edit it.
def self.up
add_column :table, :key_id, :integer
@model = Model.find(:all)
@model.each do |model|
model.update_attribute(:key_id, model.column_name_to_convert)
end
end
def self.down
remove_column :table, :key_id
end
This should get you close to what you are after. What we are going to
replace in this code are the following:
key_id = the name of the foreign_id you want to name your column
table = the name of your table (pluralized)
model = the name of the model you are querying to convert the key for.
column_name_to_convert = the name of the column you are using to convert
data from to the new key_id column.
After you do this, it will perform the following, in order:
Add your foreign_key column to your model's table.
Find all records in your model.
Iterate through all records in your model.
Change the data for key_id with the data for column_name_to_convert's
data.
Make sure the types match. If you are converting from a string you need
to use .to_i, etc.
Hopefully, this works. It should at first glance.
--
Posted via http://www.ruby-forum.com/.
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups "Ruby
on Rails: Talk" group.
To post to this group, send email to [email protected]
To unsubscribe from this group, send email to
[email protected]
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk?hl=en
-~----------~----~----~----~------~----~------~--~---