📖 Scenario: You are creating a simple blog application where each Author can write many Posts. You will set up the data models and their relationship using Rails conventions.
🎯 Goal: Build a has_many relationship between Author and Post models in Rails so that each author can have multiple posts.
📋 What You'll Learn
Create an Author model with a name attribute
Create a Post model with a title attribute and a reference to Author
Set up the has_many association in the Author model
Set up the belongs_to association in the Post model
💡 Why This Matters
🌍 Real World
This pattern is common in blog platforms, e-commerce sites, and any app where one entity owns many related items.
💼 Career
Understanding has_many relationships is essential for Rails developers building database-backed web applications.
Progress0 / 4 steps
1
Create the Author model with a name attribute
Generate a Rails model called Author with a string attribute name. Write the model class Author with ApplicationRecord inheritance and the name attribute in the migration.
Ruby on Rails
Hint
Use rails generate model Author name:string to create the model and migration.
2
Create the Post model with title attribute and author reference
Generate a Rails model called Post with a string attribute title and a reference to Author using author:references. Write the model class Post with ApplicationRecord inheritance.
Ruby on Rails
Hint
Use rails generate model Post title:string author:references to create the model and migration.
3
Add has_many association in Author model
In the Author model, add the has_many :posts association to link authors to their posts.
Ruby on Rails
Hint
Use has_many :posts inside the Author class.
4
Complete the models with associations and validations
Ensure the Post model has belongs_to :author and the Author model has has_many :posts. Add a validation for presence of name in Author and title in Post.
Ruby on Rails
Hint
Use validates :name, presence: true in Author and validates :title, presence: true in Post.
Practice
(1/5)
1. What does the has_many association in Rails represent?
easy
A. One model is linked to many instances of another model
B. One model belongs to exactly one other model
C. Models share a many-to-many relationship without a join table
D. It creates a database index automatically
Solution
Step 1: Understand the purpose of has_many
The has_many association is used to link one model to many instances of another model.
Step 2: Compare with other associations
belongs_to links one model to one other model, and many-to-many requires has_many :through or has_and_belongs_to_many.
Final Answer:
One model is linked to many instances of another model -> Option A
Quick Check:
has_many means one-to-many [OK]
Hint: Remember: has_many means one model owns many others [OK]
Common Mistakes:
Confusing has_many with belongs_to
Thinking has_many creates database indexes
Mixing up many-to-many with has_many
2. Which of the following is the correct syntax to declare a has_many association in a Rails model?
easy
A. has_many => :comments
B. has_many = comments
C. has_many :comments
D. has_many('comments')
Solution
Step 1: Recall Rails association syntax
Rails uses the syntax has_many :association_name without equals or arrows.
Step 2: Check each option
has_many :comments uses the correct symbol and syntax. Options B, C, and D use invalid Ruby syntax for associations.
Final Answer:
has_many :comments -> Option C
Quick Check:
Correct Rails association syntax = has_many :comments [OK]
Hint: Use symbol and colon: has_many :model_name [OK]
Common Mistakes:
Using equals sign instead of colon
Using hash rockets => in association
Calling has_many like a method with parentheses
3. Given these models:
class Author < ApplicationRecord
has_many :books
end
class Book < ApplicationRecord
belongs_to :author
end
What will author.books.count return if the author has 3 books?
medium
A. 3
B. 0
C. nil
D. An error because books is undefined
Solution
Step 1: Understand the association setup
The Author model has many books, and each Book belongs to an author.
Step 2: Check the method call
author.books.count counts all books linked to that author. If there are 3 books, it returns 3.
Final Answer:
3 -> Option A
Quick Check:
author.books.count = number of linked books [OK]
Hint: Count returns how many related records exist [OK]
Common Mistakes:
Expecting count to return nil or zero incorrectly
Confusing belongs_to with has_many behavior
Assuming books method is undefined
4. Identify the error in this code snippet:
class Library < ApplicationRecord
has_many :books
end
class Book < ApplicationRecord
has_many :library
end
medium
A. No error, code is correct
B. Library should use belongs_to :books
C. has_many should be replaced with has_one in Library
D. Book should use belongs_to :library, not has_many
Solution
Step 1: Check association pairing
has_many on one side must pair with belongs_to on the other side for one-to-many.
Step 2: Identify the mistake
The Book model incorrectly uses has_many :library. It should be belongs_to :library.
Final Answer:
Book should use belongs_to :library, not has_many -> Option D
Quick Check:
has_many pairs with belongs_to [OK]
Hint: has_many pairs with belongs_to, not has_many [OK]
Common Mistakes:
Using has_many on both sides
Swapping belongs_to and has_many
Using singular instead of plural for has_many
5. You want to list all comments for a post and also count how many comments have the word 'help' in them. Given:
class Post < ApplicationRecord
has_many :comments
end
class Comment < ApplicationRecord
belongs_to :post
end
Which code correctly gets the count of comments containing 'help' for a post instance post?
hard
A. post.comments.find_all { |c| c.content.include?('help') }
B. post.comments.where("content LIKE ?", "%help%").count
C. post.comments.count("content LIKE '%help%'")
D. post.comments.select { |c| c.content == 'help' }.count
Solution
Step 1: Use ActiveRecord query for filtering
To count comments containing 'help', use where with SQL LIKE and then count.
Step 2: Analyze each option
post.comments.where("content LIKE ?", "%help%").count uses correct SQL syntax and chaining. post.comments.count("content LIKE '%help%'") misuses count with a condition string. post.comments.find_all { |c| c.content.include?('help') } loads all comments and filters in Ruby but returns an array, not the count. post.comments.select { |c| c.content == 'help' }.count checks exact match, not substring.
Final Answer:
post.comments.where("content LIKE ?", "%help%").count -> Option B
Quick Check:
Use where with LIKE and count for filtered count [OK]
Hint: Use where with LIKE and count for filtered results [OK]
Common Mistakes:
Using count with a condition string incorrectly
Filtering with exact match instead of substring
Filtering in Ruby instead of database query
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.