🗂

ポリモーフィック関連付けでの機能実装

2024/12/06に公開

はじめに

エンジニア転職を目指しRuby on Railsを中心に学習中の初学者です。
備忘録として、躓いたことやケアレスミスも含め投稿します!誤っている箇所などありましたらご指摘いただけると幸いです

対象読者

  • Ruby on Rails初学者

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

ポリモーフィック関連(Polymorphic Association)は、Ruby on Railsで'異なる複数のモデル間'で'共通の関係を表現したい'場合に役立つ方法です。
この関連付けを利用すると、複数のモデル(例えば,施設(Facility)やイベント(Event))が共通のモデル(例えば、レビュー(Review)やブックマーク(Bookmark))と一対多の関係を持つことができ、それぞれが同じテーブルを参照するように設定できます。

ポリモーフィック関連を利用すると、ある一つのモデルが異なるモデルから参照されることを可能にします。例えば、施設(Facility)やイベント(Event))がそれぞれレビュー(Review)やブックマーク(Bookmark)を持てるようにする場合、通常であれば、レビューやブックマークごとに個別の関連を持つ必要がありますが、ポリモーフィック関連を使うことで、1つのコメントモデルでこれらの異なるモデルを同時に扱えます。

テーブル設計は下図です
Image from Gyazo

他にもいいね、お気に入り、カートに入れるといった機能にも使えますね!

ポリモーフィック関連の実装方法

1. モデルの設定

ポリモーフィック関連を設定するには、関連付けるモデルに「関連先モデルのID」と「関連先モデルの種類」を保存する必要があります。このため、reviewsテーブルには次の2つのカラムを用意します:

  • reviewable_id(関連先モデルのIDを保存)
  • reviewable_type(関連先モデルのクラス名を保存)
  • 上記の2つはマイグレーションファイルにそのまま記載せずt.references :reviewtable, polymorphic: true, null: false, index: true と記載する

2. マイグレーションの作成

以下は、reviewモデルにポリモーフィック関連を設定するためのマイグレーションファイルの例です:


# ターミナルで以下のコマンドを実行してマイグレーションを作成します
rails generate migration CreateReviews reviewable:references{polymorphic} body:text

このコマンドにより生成されるマイグレーションファイルを以下のように編集します:

ruby
コードをコピーする
class CreateReviews < ActiveRecord::Migration[7.1]
  def change
    create_table :reviews do |t|
      t.text :body
      t.references :reviewtable, polymorphic: true, null: false, index: true
      t.timestamps
    end
  end
end

ここで、t.references :commentable, polymorphic: true とすることで、commentable_typecommentable_idが自動的に生成されます。

3. モデルの関連付け

次に、モデルにポリモーフィック関連を設定します。

ruby
コードをコピーする
# Reviewモデル
class Review < ApplicationRecord
  belongs_to :reviewable, polymorphic: true
end

# Facilityモデル
class Facility < ApplicationRecord
  has_many :reviews, as: :reviewtable
end

# Eventモデル
class Event < ApplicationRecord
  has_many :reviews, as: :reviewtable
end

上記の設定により、ReviewモデルがFacilityEventと関連付けられるようになりました!

Discussion