Railsにおけるポリモーフィック関連の基礎

Ruby on Railsにおいて、「ポリモーフィック関連」は複数のモデルが同一のモデルに関連するケースでよく使用される。

ポリモーフィック関連とは?

ポリモーフィック関連を使うことで、一つのモデルが複数の異なるモデルと関連を持つことができる。

実装例

CommentモデルがArticleProductに関連する例。

モデルの設定

まずはモデルの設定。Commentモデルにはcommentableという名前でポリモーフィック関連を定義。

# app/models/comment.rb
class Comment < ApplicationRecord
  belongs_to :commentable, polymorphic: true
end

ArticleProductモデルでは、has_manyを用いてCommentとの関連を定義。

# app/models/article.rb
class Article < ApplicationRecord
  has_many :comments, as: :commentable
end

# app/models/product.rb
class Product < ApplicationRecord
  has_many :comments, as: :commentable
end

データベースの設定

データベースでも少し特別な設定が必要。commentsテーブルには、commentable_typecommentable_idという2つのカラムを追加。

# db/migrate/xxxx_create_comments.rb
class CreateComments < ActiveRecord::Migration[6.0]
  def change
    create_table :comments do |t|
      t.text :content
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
  end
end

データの操作

データの作成や取得は以下のように行える。

# コメントを作成
article = Article.find(1)
comment_for_article = article.comments.create(content: 'Great article!')

product = Product.find(1)
comment_for_product = product.comments.create(content: 'Awesome product!')

# コメントを取得
article_comments = article.comments
product_comments = product.comments

まとめ

Railsのポリモーフィック関連は、一つのモデル(この例ではComment)が複数の異なるモデル(ArticleProduct)と関連を持つことを容易にする。
これによってコードがDRY(Don't Repeat Yourself)になり、アプリケーションのメンテナンスが容易になる。