Adding foreign key to a rails model Adding foreign key to a rails model ruby ruby

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")