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
-~----------~----~----~----~------~----~------~--~---

Reply via email to