Bird
Raised Fist0
Ruby on Railsframework~10 mins

Polymorphic associations in Ruby on Rails - Interactive Code Practice

Choose your learning style10 modes available
Practice - 5 Tasks
Answer the questions below
1fill in blank
easy

Complete the code to declare a polymorphic association in a Rails model.

Ruby on Rails
class Comment < ApplicationRecord
  belongs_to :[1], polymorphic: true
end
Drag options to blanks, or click blank then click option'
Acommentable
Bcomment
Cpostable
Dcommented
Attempts:
3 left
💡 Hint
Common Mistakes
Using the model name 'comment' instead of the polymorphic association name.
Using a non-standard association name that doesn't match other models.
2fill in blank
medium

Complete the code to declare a polymorphic has_many association in a Rails model.

Ruby on Rails
class Post < ApplicationRecord
  has_many :[1], as: :commentable
end
Drag options to blanks, or click blank then click option'
Acommentables
Bcomments
Ccomment
Dposts
Attempts:
3 left
💡 Hint
Common Mistakes
Using singular form instead of plural for has_many.
Using a name that does not match the polymorphic association.
3fill in blank
hard

Fix the error in the migration to create a polymorphic reference.

Ruby on Rails
create_table :comments do |t|
  t.references :[1], polymorphic: true, null: false
  t.text :content
  t.timestamps
end
Drag options to blanks, or click blank then click option'
Acommentable
Bcomment
Ccommented
Dcomments
Attempts:
3 left
💡 Hint
Common Mistakes
Using the model name 'comment' instead of the polymorphic association name.
Using plural form in the reference name.
4fill in blank
hard

Fill both blanks to complete the polymorphic association in the model and migration.

Ruby on Rails
class Picture < ApplicationRecord
  belongs_to :[1], polymorphic: true
end

create_table :pictures do |t|
  t.references :[2], polymorphic: true, null: false
  t.string :image_url
  t.timestamps
end
Drag options to blanks, or click blank then click option'
Aimageable
Bpictureable
Cimage
Dpicture
Attempts:
3 left
💡 Hint
Common Mistakes
Using different names in model and migration.
Using singular or plural inconsistently.
5fill in blank
hard

Fill all three blanks to create a polymorphic association with validations.

Ruby on Rails
class Tag < ApplicationRecord
  belongs_to :[1], polymorphic: true

  validates :[2], presence: true
  validates :[3], presence: true
end
Drag options to blanks, or click blank then click option'
Ataggable
Btaggable_id
Ctaggable_type
Dtag
Attempts:
3 left
💡 Hint
Common Mistakes
Validating the association name instead of the foreign key and type columns.
Using incorrect column names for validations.

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

  1. Step 1: Understand polymorphic association concept

    Polymorphic associations let one model belong to multiple other models through a single interface.
  2. 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.
  3. Final Answer:

    To allow a model to belong to more than one other model using a single association -> Option A
  4. 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

  1. Step 1: Recall belongs_to polymorphic syntax

    The correct syntax uses belongs_to :name, polymorphic: true in the model that belongs to multiple types.
  2. 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.
  3. Final Answer:

    belongs_to :commentable, polymorphic: true -> Option D
  4. Quick Check:

    belongs_to with polymorphic: true = belongs_to :commentable, polymorphic: true [OK]
Hint: belongs_to uses polymorphic: true, has_many uses as: :name [OK]
Common Mistakes:
  • 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

  1. Step 1: Understand polymorphic type storage

    The polymorphic association stores the class name of the associated object in commentable_type.
  2. Step 2: Identify the associated model

    The comment belongs to a Post, so commentable_type will be "Post".
  3. Final Answer:

    "Post" -> Option C
  4. 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

  1. Step 1: Check required polymorphic keys

    Polymorphic belongs_to requires both imageable_type and imageable_id to be present for a valid association.
  2. 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.
  3. Final Answer:

    Picture.create(imageable_type: nil, imageable_id: 2) -> Option A
  4. 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

  1. Step 1: Identify polymorphic association pattern

    Comments belong to a polymorphic commentable interface, allowing multiple models to share comments.
  2. 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.
  3. Final Answer:

    polymorphic belongs_to and has_many as: :commentable -> Option B
  4. 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 unknown strong while earning +1 Grip toward your certificate.

10 questions~5 mineasy hard