I want to make a migration
in Rails, referencing another table. Usually, I would do something like:
add_column :post, :user, :references
This creates a column named user_id
in posts
table. But what if, instead of user_id
, I want something like author_id
? How can I do that?
In rails 4, when using postgresql and the schema_plus gem you can just write
This will create a column
author_id
, which correctly refers tousers(id)
.And in your model, you write
Do it manually:
but now, when you create the belongs_to statement, you will have to modify it, so now you have to call
In Rails 4.2+ you can also set foreign keys in the db as well, which is a great idea.
For simple associations this can be done also on
t.references
addingforeign_key: true
, but in this case you'll need two lines.For Rails 5+
Initial Definition:
If you are defining your
Post
model table, you can setreferences
,index
andforeign_key
in one line:Update Existing:
If you are adding references to an existing table, you can do this:
Note: The default value for
index
is true.alias_attribute(new_name, old_name) is very handy. Just create your model and the relationship:
then edit the model and add an attribute alias with
After that you'll be able to run things like
If you aren't using a foreign key, then it doesn't matter what the actual table name of the other table is.
As of Rails 5, if you're using a foreign key, you can specify the name of the other table in the foreign key options. (see https://github.com/rails/rails/issues/21563 for discussion)
Prior to Rails 5, you should add the foreign key as a separate step: