Reputation: 69757
I have the following Rails migration which works perfectly (irrelevant pieces removed):
create_table :comments do |t|
t.text :body
t.references :post
end
Now I'd like to add an author
column to my comments
table (which is the userid of a user), but I have no idea how to do it (I'm tempted to just write the MySql-specific syntax using an execute
).
I've been looking at add_column here which doesn't mention references
. I've actually found TableDefinition#references but I have no idea how to use it with an add_column
statement.
Is this possible? Also, is it true that, for MySql, the "references" functionality does not actually establish relationships between the tables?
Upvotes: 66
Views: 48874
Reputation: 2909
Finally got it
add_column :locations, :state_id , :integer, :references => "states"
Upvotes: 38
Reputation:
You could add the column by add_column(:table, :column_name, :type, :options)
in a new Migration.
Upvotes: 0
Reputation: 15596
First, do:
script/generate migration AddAuthorIdToComments
Open the generated file and add this line:
add_column :comments, :author_id, :integer
Then in your model files:
class User < ActiveRecord::Base
has_many :comments, :foreign_key => "author_id"
end
class Comment
belongs_to :author, :class_name => User
end
Upvotes: 22
Reputation: 23307
While it's too late to get any points out of this, I thought I'd post the best way for posterity :)
use change_table
instead of create_table
to add columns to a table that already exists, with all the TableDefinition goodness:
self.up do
change_table :comments do |t|
t.references :author
end
end
This might seem trivial, but other gems like Devise make heavy use of their own custom table definitions, and this way you can still use them.
Upvotes: 118
Reputation: 126547
It's been a while since I've looked at this, but last I checked migrations don't support creating foreign keys. Fortunately, however, there is a plug-in for it. I've used this and it works well.
Upvotes: 2