Adding foreign key to a rails model
The currently accepted answer on this isn't really accurate as it doesn't add a database foreign key. It's just adding integer columns.
In Rails 4.2.x, the current approach is:
http://guides.rubyonrails.org/active_record_migrations.html#foreign-keys
Create a migration:
rails generate migration migration_name
For existing columns, in the migration add the foreign keys like this:
class MigrationName < ActiveRecord::Migration def change add_foreign_key :business_hours, :businesses add_foreign_key :businesses, :users endend
For Rails 4.x or if you're adding a new column and want it to be a foreign key you can do this, where you probably also want to specify the index as true, but that's not part of the requirement for the foreign key:
http://edgeguides.rubyonrails.org/active_record_migrations.html#creating-a-migration
class MigrationName < ActiveRecord::Migration def change add_reference :business_hours, :business, index: true, foreign_key: true add_reference :businesses, :user, index: true, foreign_key: true endend
First of all when you use belongs_to method don't use s
at the end of the word: business_hours belongs_to business which belongs_to user
.
Now create a migration:
rails generate migration migration_name
And in migration add columns:
class MigrationName < ActiveRecord::Migration def change add_foreign_key :business_hours, :businesses add_foreign_key :businesses, :users endend
Run rake db:migrate
. That's it.
Rails 5 now can add foreign key in migrations, see http://devdocs.io/rails~5.0/activerecord/connectionadapters/schemastatements#method-i-add_foreign_key. So
add_foreign_key :articles, :authors
creates
ALTER TABLE "articles" ADD CONSTRAINT fk_rails_e74ce85cbc FOREIGN KEY ("author_id") REFERENCES "authors" ("id")
If you have a non standard data model you can do.
add_foreign_key :articles, :users, column: :author_id, primary_key: "lng_id"
which creates
ALTER TABLE "articles" ADD CONSTRAINT fk_rails_58ca3d3a82 FOREIGN KEY ("author_id") REFERENCES "users" ("lng_id")