ポリモーフィック関連付けでの機能実装
はじめに
エンジニア転職を目指しRuby on Railsを中心に学習中の初学者です。
備忘録として、躓いたことやケアレスミスも含め投稿します!誤っている箇所などありましたらご指摘いただけると幸いです
対象読者
- Ruby on Rails初学者
ポリモーフィック関連とは
ポリモーフィック関連(Polymorphic Association)は、Ruby on Railsで'異なる複数のモデル間'で'共通の関係を表現したい'場合に役立つ方法です。
この関連付けを利用すると、複数のモデル(例えば,施設(Facility)やイベント(Event))が共通のモデル(例えば、レビュー(Review)やブックマーク(Bookmark))と一対多の関係を持つことができ、それぞれが同じテーブルを参照するように設定できます。
ポリモーフィック関連を利用すると、ある一つのモデルが異なるモデルから参照されることを可能にします。例えば、施設(Facility)やイベント(Event))がそれぞれレビュー(Review)やブックマーク(Bookmark)を持てるようにする場合、通常であれば、レビューやブックマークごとに個別の関連を持つ必要がありますが、ポリモーフィック関連を使うことで、1つのコメントモデルでこれらの異なるモデルを同時に扱えます。
他にもいいね、お気に入り、カートに入れるといった機能にも使えますね!
ポリモーフィック関連の実装方法
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_type
とcommentable_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
モデルがFacility
やEvent
と関連付けられるようになりました!
Discussion