👜

通知機能の実装 Part1 (ポリモーフィック関連付け)

2023/10/06に公開

この記事で分かること

  • ポリモーフィック関連付けについて

通知機能の実装方法を調べていると、「ポリモーフィック関連付け」がヒットしたので実装することにしました。

参考にさせていただいた記事

https://qiita.com/sazumy/items/726e7097c6ca4a9ca6e3

前提条件

  • いいね、コメント、フォロー機能が実装済み

ポリモーフィック関連付け

ポリモーフィック関連付け(Polymorphic Association)は、Ruby on Railsなどのプログラムフレームワークで使われるデータモデルの関連付け方法の一つです。このアプローチを用いると、1つのモデルが異なる種類のモデルと関連付けることができます。

ER図(イメージ)

ポリモーフィック関連付けをする理由はnotificationモデルにfavorite_id,post_comment_id,relationship_idの3つのカラムを用意するよりも、subject_idという1つのカラムで済むようになるから便利だよねってイメージでした。

ポリモーフィック関連付けをするメリットは?

ポリモーフィック関連付けをするメリットはnotificationモデルに>favorite_id,post_comment_id,relationship_idの3つのカラムではなくて、subject_idという1つのカラムで済むようになるから便利だよねってイメージでした。

→ 実際にコードを書くときも、(notification.subject)だけで3つのインスタンスを呼び出せるようになります。

このように、プログラムをシンプルに保ちながら、多様な関連性を表現するために使用するらしいです。

ポリモーフィック関連付けをコードで示す

初めにnotificationモデルを作成します。

rails g model notification
class CreateNotifications < ActiveRecord::Migration[6.1]
  def change
    create_table :notifications do |t|
+     t.references :subject, polymorphic: true
+     t.references :user, foreign_key: true
+     t.integer :action_type, null: false
+     t.boolean :checked, null: false, default: false
      t.timestamps
    end
  end
end
  • action_type・・・コメントかいいねかフォローかを数値で仕分けをするため。
  • checked・・・既読 or 未読を管理します。 (通知機能では既読済みは削除する)

確認したらmigrateします。

それぞれのモデルに記述します。

notifications.rb
 belongs_to :subject, polymorphic: true
  • favorite,post_comment,relationship.rb(関連付けしたいモデル)
has_one :notification, as: :subject, dependent: :destroy

これで「ポリモーフィック関連付け」は完成です。

(続き)
https://zenn.dev/tya0116/articles/f5cf48deee50d9

この記事をかいた人

https://twitter.com/tya_dwc
23/6/1にDWCに入学し、主にRailsの学習に取り組みました。卒業が近づきこれから何で学習をするか悩んだときに、技術ブログをしようと考えました。初心者ですがよろしくお願いします。

Discussion