質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

475閲覧

ユーザー全員に対して共通の通知を出したい場合の実装方法

Tsukuni

総合スコア34

Ruby on Rails 5

Ruby on Rails 5は、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

3クリップ

投稿2019/04/18 08:24

やりたいこと

現在Ruby on Railsで通知機能を作っています。
通知の種類としては、例えば、”コメントがされた。お気に入りされた。”などの特定のユーザ向けの通知と、”〇〇機能が追加されました”のようなユーザ全員共通の通知です。
ユーザーが通知を見たかどうかの既読未読の判断をしたいのでユーザ一人に対して一つnotificationを作成する方法しか思いつきません。ユーザ数が少ないときはこのやり方でも問題はないのかもしれませんが増えてきたときはきつくなると思います。
何かいい方法はないでしょうか
よろしくお願いします。

簡単にモデルを書きました

class User < ApplicationRecord has_many :notifications end class notification < ApplicationRecord belongs_to :user belongs_to :notifiable, polymorphic: true end

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

まず、ロジックが異なるので個人用の通知とは別のテーブルで管理したほうが良いと思います

またユーザ一人に対して一つ通知を作成する方法は懸念の通りデータ量の問題もありますが、通知の削除や編集なのも不便なので、既読データは別テーブルにするのが良いでしょう

更にデータ量削減を優先するなら未読データを作らない手もあります

ruby

1class User < ApplicationRecord 2 has_many :information_reads 3 has_many :read_infomations, through: :information_reads, class_name: 'Information' 4 5 # 未読データを作らないので既読の否定で算出する 6 scope :unread_infomations, (lamda do 7 Information.where.not(id: information_readings.select(:information_id)) 8 end) 9end 10 11# 全ユーザー分の未読データを作るのが無駄なので既読データだけを登録する 12class InfomationRead < ApplicationRecord 13 belongs_to :user 14 belongs_to :information 15end 16 17# 通知データ本体はユーザー別には作らない 18class Information < ApplicationRecord 19 # 通知削除時には既読データを一緒に消す 20 has_many :infomation_read, dependent: :delete_all 21end

■ 補足

未読データを作らない場合、通知作成後の新規ユーザーにも過去通知が未読で見えることになります
そのような事を避けたい場合は、日付など何らかの方法で制御する必要があるので注意が必要です

ruby

1 scope :unread_infomations, (lamda do 2 Information.where.not(id: information_readings.select(:information_id)) 3 .where('users.created_at < informations.created_at') 4 end)

投稿2019/04/19 02:50

Ighrs

総合スコア656

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Tsukuni

2019/04/19 03:04

確かにこの方法だと全員に通知を作らずに済みますね!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問