January 2, 2023 By Matthew Rathbone *
On this page

Foreign keys are used to establish relationships between different database tables, and are a fundamental part of database design. For example, if you have a users table and a posts table in your application, you might want to use a foreign key to link each post to the user who created it. This way, you can easily retrieve all of the posts for a given user by querying the posts table using the foreign key.

To create a foreign key using Rails migration, you will first need to create a migration file using the rails generate migration command. This will create a new file in the db/migrate directory of your Rails application with a unique timestamp as the filename. In this file, you will define the foreign key using the add_foreign_key method, which takes three arguments: the name of the table that the foreign key should be added to, the name of the column that will hold the foreign key, and a hash of options.

Here is an example of how you might use the add_foreign_key method to add a foreign key to the posts table that links each post to a user:

class AddUserIdToPosts < ActiveRecord::Migration[6.0]
  def change
    add_foreign_key :posts, :users, column: :user_id
  end
end

This migration will add a user_id column to the posts table and set it as a foreign key that references the id column in the users table. The column: :user_id option specifies the name of the column in the posts table that will hold the foreign key.

You can also use the remove_foreign_key method to remove a foreign key from a table. This method takes two arguments: the name of the table that the foreign key should be removed from, and the name of the column that holds the foreign key.

For example, to remove the foreign key that we just added to the posts table, you could use the following migration:

class RemoveUserIdFromPosts < ActiveRecord::Migration[6.0]
  def change
    remove_foreign_key :posts, :user_id
  end
end

It’s important to note that Rails migration does not automatically create an index on the foreign key column, so you may want to consider adding one manually using the add_index method. This will improve the performance of queries that use the foreign key to join tables.

In summary, Rails migration is a powerful tool for managing changes to your database schema, and the add_foreign_key and remove_foreign_key methods make it easy to add and remove foreign keys as needed. By using foreign keys to link related tables, you can structure your database in a way that makes it easier to retrieve and manipulate data.