LoginSignup
0
0

More than 1 year has passed since last update.

【Rails】 通知機能の難しい箇所を解説してみた

Last updated at Posted at 2021-10-21

通知機能

PFに通知機能を搭載したのですが、
理解するのが難しかったため勉強もかねて
通知機能の難しい箇所をひとつひとつ解説することにします!

流れ

・モデルの解説
・コントローラーの解説
・ヘルパーの解説

モデルの解説

app/models/post

  # 通知機能のアソシエーション
  has_many :notifications, dependent: :destroy

  def create_notification_by(current_user)
    notification = current_user.notifications.new(post_id: id, visited_id: user_id, action:"like")
    notification.save if notification.valid?
  end

# comment_idはコントローラーで@comment.idと指定しているので
# 投稿のidを引数にいれている
  def create_notification_comment!(current_user, comment_id)
# Commentモデルのpost_idに紐づくすべてのuser_idを引っ張ってくるが
# current_userは引っ張ってこない。
# そしてdistinctをすることで一意になる
    temp_ids = Comment.select(:user_id).where(post_id: id).where.not(user_id: current_user.id).distinct
# temp_idsで取ってきたすべてのコメントをeachで回す
    temp_ids.each do |temp_id|
# 引数は送る側になるのでdef create_notification_comment!(current_user, comment_id)で
# 指定いる引数と同じにしないといけない
      save_notification_comment!(current_user, comment_id, temp_id['user_id'])
    end

    save_notification_comment!(current_user, comment_id, user_id) # if temp_ids.blank?
  end

  def save_notification_comment!(current_user, comment_id, visited_id)
    notification = current_user.notifications.new(
      post_id: id, comment_id: comment_id, visited_id: visited_id, action: 'comment'
    )
    if notification.visitor_id == notification.visited_id
      notification.checked = true
    end
    notification.save if notification.valid?
  end
end
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