0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Railsでポリモーフィック関連付けを使用した柔軟なモデル関連付けの実装」

Posted at

はじめに

アプリ制作の過程で、ポリモーフィック関連を用いた実装を行いました。ここではその実装過程で得られた気づきをまとめます。ポリモーフィック関連について実際の例を交えながらなるべく分かりやすくまとめたいと思います。

なぜポリモーフィック関連付けが便利なのか

例えば、ブログ記事にコメントを付ける機能を作ったとします。その後、イベントページにもコメントを付けたくなったとします。通常であれば、新しくコードを書き足さないといけないと思います。しかし、ポリモーフィック関連付けを使うと、既存のコードをほとんど変更せずに、イベントにもコメントを付けられるようになります。
それでは、実際にコードを見ていきましょう。

モデルの設定

まず、モデルの設定から。ArticleEventCommentの3つのモデルを作ります。

class Article < ApplicationRecord
  has_many :comments, as: :commentable
end

class Event < ApplicationRecord
  has_many :comments, as: :commentable
end

class Comment < ApplicationRecord
  belongs_to :commentable, polymorphic: true
end

class Game < ApplicationRecord
  belongs_to :home_teamable, polymorphic: true
  belongs_to :away_teamable, polymorphic: true
end

ここでのポイントは、ArticleEventhas_many :comments, as: :commentableと書いているところです。
これで「コメント可能な」オブジェクトとして定義されます。Commentモデルのbelongs_to :commentable, polymorphic: trueも重要です。これで、CommentArticleEventにも紐付けられるようになります。

テーブルの定義

次に、テーブルの設定です。マイグレーションファイルを作成して、必要なテーブルを作ります。

class CreateComments < ActiveRecord::Migration[6.1]
  def change
    create_table :comments do |t|
      t.text :content, null: false
      t.references :commentable, polymorphic: true, index: true
      t.timestamps
    end
  end
end

ここで常用なのは、t.references :commentable, polymorphic: trueの部分です。これによって、commentsテーブルにcommentable_typecommentable_idというカラムが追加されます。これらのカラムを使って、コメントがArticleに属しているのか、Eventに属しているのかを判断することができます。

ビューの設定

最後に、ビューの例も見てみましょう。

<%= form_with(model: [ @commentable, @comment ], local: true) do |form| %>
  <div class="field">
    <%= form.label :content, 'コメント' %>
    <%= form.text_area :content %>
  </div>
  <div class="actions">
    <%= form.submit '投稿する' %>
  </div>
<% end %>

このフォームは、ArticleページとEventページで使えます。@commentableの中身が自動的に判断されるので、同じフォームで両方に対応することができます。

まとめ

ポリモーフィック関連付けを使うとかなりスマートにコードを書くことだできます。僕自身まだまだ使いこなせておらず少し難しく感じる部分もありますが、使いこなせるようになるとコードの可読性と拡張性が大幅に向上するはずです。

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?