How to Make a belongs_to Relationship in Rails

Jeff Morhous // January 22, 2023

What is belongs_to and has_many in Ruby on Rails

ActiveRecord makes it really easy to tie models in a Rails app to other models. In fact, you can even specify when you create a model what it should be associated with. If you already have to models and you would like one model to belong to the other, you'll need to change both models and create a migration.

Let's say you have a model, Tweet, and another model, User. A user can tweet many times, and a tweet only belongs to one user. In ActiveRecord speak, User has_many tweets, and a Tweet belongs_to a User. The database records are tied together, and you can build features around the association easily.

How to Implement belongs_to and has_many

Continuing on the User/Tweet example, in the Tweet class, simply add belongs_to :user. The class should look like this:

class Tweet < ApplicationRecord
  belongs_to :user
end

In the User class, simply add has_many :tweets. The class should look like this:

class Tweet < ApplicationRecord
    has_many :tweets
end

This will tell rails to generate some methods you can use, but you still need to tie the database records together. Create a new migration by running:

rails generate migration AddUserIdToTweets

In the migration file, make the change method look like this:

  def change
    add_column :tweets, :user_id, :integer
  end

This adds a user_id column to the Tweets database table, which rails will use to keep track of which user a tweet object belongs to.

How to Get Use a belong_to and has_many relationship

You can use the association to do a number of things, including getting all tweets that belong to a given user. The call is simple enough, and assuming current_user refers to a User model, it looks like this:

current_user.tweets

To create a new Tweet that belong to a user, you can do this:

current_user.tweets.build(tweet_params)

Hope this was helpful!

Consider subscribing to my newsletter to get occasional updates about new things I make or write.