Forem

Augusts Bautra
Augusts Bautra

Posted on

How to split out a specific case from a polymorphic association

Let's say we have a model structure that allows us to make comments on anything:

Comment.has_one :comment_commentee_tie

CommentCommenteeTie
  belongs_to :comment
  belongs_to :commentee, polymorphic: true

Post
  has_many :comment_commentee_ties
Enter fullscreen mode Exit fullscreen mode

Now let's say we want to filter comments by possible post data. To alleviate the joining, we can define a non-polymorphic association for Comment:

Comment
  has_one :comment_commentee_tie
  has_one :post, through: :comment_commentee_tie, source: :commentee, source_type: "Post"
Enter fullscreen mode Exit fullscreen mode

Polymorphic children

Let's look at the harder case with has_many :children, polymorphic: true

We can use the scope option to filter what types of children we want:

Parent
  has_many :parent_child_ties

  has_many(
    :good_children,
    -> { where(child_type: "GoodChild") },
    through: :parent_child_ties,
    source: :child,
    source_type: "GoodChild"
  )
Enter fullscreen mode Exit fullscreen mode

Image of Datadog

The Essential Toolkit for Front-end Developers

Take a user-centric approach to front-end monitoring that evolves alongside increasingly complex frameworks and single-page applications.

Get The Kit

Top comments (0)

Postmark Image

Speedy emails, satisfied customers

Are delayed transactional emails costing you user satisfaction? Postmark delivers your emails almost instantly, keeping your customers happy and connected.

Sign up