A polymorphic association lets a model belong to more than one other model using a single association. It uses a type and an ID to link to different models through one interface.
Click to reveal answer
beginner
How do you declare a polymorphic belongs_to association in Rails?
Use belongs_to :attachable, polymorphic: true in the model that belongs to multiple other models.
Click to reveal answer
beginner
What columns are required in the database for a polymorphic association?
You need two columns: one for the ID (e.g., <code>attachable_id</code>) and one for the type (e.g., <code>attachable_type</code>) to store the associated model's class name.
Click to reveal answer
intermediate
How do you set up the other side of a polymorphic association?
Use has_many :attachments, as: :attachable in the models that can have attachments. The as: option tells Rails this is a polymorphic interface.
Click to reveal answer
intermediate
Why use polymorphic associations instead of multiple separate associations?
Polymorphic associations reduce code duplication and database complexity by allowing one model to relate to many others without needing separate foreign keys or tables for each.
Click to reveal answer
Which two columns are essential for a polymorphic association in Rails?
Aattachable_key and attachable_name
Battachable_id and attachable_type
Cattachable_key and attachable_type
Dattachable_id and attachable_name
✗ Incorrect
Rails uses attachable_id to store the associated record's ID and attachable_type to store the class name.
How do you declare a polymorphic association on the model that belongs to multiple models?
Abelongs_to :attachable, polymorphic: true
Bhas_one :attachable, polymorphic: true
Chas_many :attachable, polymorphic: true
Dbelongs_to :attachable
✗ Incorrect
The model that belongs to multiple others uses belongs_to :attachable, polymorphic: true.
What does the as: option do in a has_many association?
ADeclares a scope
BSpecifies the foreign key name
CSets the table name
DDefines the polymorphic interface name
✗ Incorrect
The as: option tells Rails the name of the polymorphic interface to use.
Which of these is a benefit of polymorphic associations?
AThey simplify code by using one association for many models
BThey require more database tables
CThey prevent models from sharing associations
DThey only work with one model
✗ Incorrect
Polymorphic associations let one model relate to many others through a single association, simplifying code.
If a Comment model belongs to either a Post or a Photo, what would the polymorphic association look like in Comment?
Ahas_many :commentable, polymorphic: true
Bbelongs_to :post_or_photo
Cbelongs_to :commentable, polymorphic: true
Dhas_one :commentable
✗ Incorrect
The Comment model uses belongs_to :commentable, polymorphic: true to belong to either Post or Photo.
Explain how polymorphic associations work in Rails and why they are useful.
Think about how one model can connect to many different models using one link.
You got /5 concepts.
Describe the database setup needed to support a polymorphic association in Rails.
Focus on the columns that store the link to other models.
You got /4 concepts.
Practice
(1/5)
1. What is the main purpose of polymorphic associations in Rails?
easy
A. To allow a model to belong to more than one other model using a single association
B. To create a one-to-one relationship between two models
C. To enforce database constraints on foreign keys
D. To automatically generate views for multiple models
Solution
Step 1: Understand polymorphic association concept
Polymorphic associations let one model belong to multiple other models through a single interface.
Step 2: Compare options with concept
To allow a model to belong to more than one other model using a single association correctly describes this flexibility. Other options describe unrelated features.
Final Answer:
To allow a model to belong to more than one other model using a single association -> Option A
Quick Check:
Polymorphic association = flexible belongs_to [OK]
Hint: Polymorphic means one interface for many models [OK]
Common Mistakes:
Thinking it creates one-to-one relationships
Confusing with database foreign key constraints
Assuming it auto-generates views
2. Which of the following is the correct syntax to declare a polymorphic belongs_to association in a Rails model?
easy
A. has_many :commentable, polymorphic: true
B. has_one :commentable, polymorphic: true
C. belongs_to :commentable, as: :polymorphic
D. belongs_to :commentable, polymorphic: true
Solution
Step 1: Recall belongs_to polymorphic syntax
The correct syntax uses belongs_to :name, polymorphic: true in the model that belongs to multiple types.
Step 2: Match options with syntax
belongs_to :commentable, polymorphic: true matches this exactly. Options A and D use wrong association types, and C uses incorrect keyword.
Final Answer:
belongs_to :commentable, polymorphic: true -> Option D
Quick Check:
belongs_to with polymorphic: true = belongs_to :commentable, polymorphic: true [OK]
Using has_many instead of belongs_to for polymorphic
Using 'as: :polymorphic' instead of 'polymorphic: true'
Confusing has_one with belongs_to
3. Given these models:
class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
end
class Post < ApplicationRecord
has_many :comments, as: :commentable
end
class Photo < ApplicationRecord
has_many :comments, as: :commentable
end
What will post.comments.first.commentable_type return if the first comment belongs to a Post?
medium
A. "Photo"
B. "Comment"
C. "Post"
D. nil
Solution
Step 1: Understand polymorphic type storage
The polymorphic association stores the class name of the associated object in commentable_type.
Step 2: Identify the associated model
The comment belongs to a Post, so commentable_type will be "Post".
Final Answer:
"Post" -> Option C
Quick Check:
commentable_type stores class name = "Post" [OK]
Hint: commentable_type holds the class name of associated model [OK]
Common Mistakes:
Confusing commentable_type with comment class
Expecting the associated object instead of its type string
Assuming nil if association exists
4. You have this model:
class Picture < ApplicationRecord
belongs_to :imageable, polymorphic: true
end
Which of these will cause an error when creating a Picture?
medium
A. Picture.create(imageable_type: nil, imageable_id: 2)
B. Picture.create(imageable_type: "Product", imageable_id: 2)
C. Picture.create(imageable_type: "User", imageable_id: 1)
D. Picture.create(imageable_type: "User", imageable_id: 3)
Solution
Step 1: Check required polymorphic keys
Polymorphic belongs_to requires both imageable_type and imageable_id to be present for a valid association.
Step 2: Identify missing or nil values
Picture.create(imageable_type: nil, imageable_id: 2) has imageable_type: nil, which breaks the association and causes an error.
Final Answer:
Picture.create(imageable_type: nil, imageable_id: 2) -> Option A
Quick Check:
Missing polymorphic type causes error [OK]
Hint: Both type and id must be present for polymorphic belongs_to [OK]
Common Mistakes:
Assuming nil imageable_type is acceptable
Ignoring missing type causes runtime error
Confusing polymorphic keys with normal foreign keys
5. You want to add comments to both Articles and Events using polymorphic associations. Which setup correctly models this?
hard
A. class Comment < ApplicationRecord
belongs_to :article
belongs_to :event
end
B. class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
end
class Article < ApplicationRecord
has_many :comments, as: :commentable
end
class Event < ApplicationRecord
has_many :comments, as: :commentable
end
C. class Comment < ApplicationRecord
has_many :articles
has_many :events
end
D. class Article < ApplicationRecord
belongs_to :comment
end
class Event < ApplicationRecord
belongs_to :comment
end
Solution
Step 1: Identify polymorphic association pattern
Comments belong to a polymorphic commentable interface, allowing multiple models to share comments.
Step 2: Match correct model declarations
class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
end
class Article < ApplicationRecord
has_many :comments, as: :commentable
end
class Event < ApplicationRecord
has_many :comments, as: :commentable
end correctly uses belongs_to :commentable, polymorphic: true in Comment and has_many :comments, as: :commentable in Article and Event.
Final Answer:
polymorphic belongs_to and has_many as: :commentable -> Option B
Quick Check:
Polymorphic belongs_to + has_many as: = class Comment < ApplicationRecord
belongs_to :commentable, polymorphic: true
end
class Article < ApplicationRecord
has_many :comments, as: :commentable
end
class Event < ApplicationRecord
has_many :comments, as: :commentable
end [OK]
Hint: Use belongs_to polymorphic in child, has_many as: in parents [OK]
Common Mistakes:
Trying to belongs_to both models separately
Using has_many in Comment instead of belongs_to
Assigning belongs_to comment in parent models
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.