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

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

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

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

Q&A

解決済

1回答

2266閲覧

Rails4.2 お知らせ一覧の作り方

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby on Rails

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

0グッド

2クリップ

投稿2015/07/03 16:44

編集2015/07/03 16:46

teratailのお知らせ一覧のような機能を作ったのですが、我ながらクソだな。。と思い作り直したいのですが、アドバイスを下さい

現状
itemに質問などのアクションが起きた際に、notificationをレコードを発行し、それをnotification contorollerで集めて、view側で対応する文言を当てはめています。

問題点
① notificationのレコード数が10万、100万になった場合のパフォーマンス
(多分まともに動かない気がする)
② 未読数を表示するためにapplication.html.erbに書いたコードが毎回呼び出されるのでパフォーマンスが。。
③view側で文言を振り分けているのがよくない気がする。。がどうしていいかわからない

lang

1#application.html.erb 2<!-- お知らせ一覧 --> 3 <li> 4 <a href="/notifications/"> 5 <i class="fa fa-bell-o"></i> 6 <!-- Indicator with number --> 7 <% if @recent_notifications_activity.present? %> 8 <span class="navbar-new"><%= @recent_notifications_activity.count %></span> 9 <% end %> 10 </a> 11 </li> 12 13 14 15#notifications/index.html.erb 16<% @notifications.each do |comment| %> 17 18<!-- 質問 --> 19 <% if comment.body_num == 10000 %> 20 <a href="<%= item_url(comment.item_id) %>" class="list-group-item"> 21 &ensp;<i class="fa fa-comment-o"></i>&ensp; 22 <small>アイテムに<%= comment.item.title%>に<%= comment.originator.profile.user_name%>さんが質問しました。</small> 23 <p class="palette-paragraph text-right"><small><i class="fa fa-clock-o"></i>&ensp;<%=date_format(comment.created_at) %></small></p> 24 </a> 25 <% end %> 26<!-- アイテムが更新されました --> 27<!-- 削除されました。 --> 28<% end %>

lang

1#notification controller 2class NotificationsController < ApplicationController 3 4 # GET /notifications 5 # GET /notifications.json 6 def index 7 @user = current_user.id 8 @notifications = Notification.where("(recipient_id = ?) OR (body_num = ?)", @user, 80000) 9 .order(created_at: :desc) 10 .includes(:item).includes(:originator => :profile) 11 .page(params[:page]).per(15) 12 #アクセスフラグ 13 @notifications.update_all({status: true}) 14 end 15 16 private 17 # Never trust parameters from the scary internet, only allow the white list through. 18 def notification_params 19 params.require(:notification).permit(:status, :originator_id, :recipient_id, :item_id, :navi_id) 20 end 21end 22

lang

1#notification db migrate 2class CreateNotifications < ActiveRecord::Migration 3 def change 4 create_table :notifications do |t| 5 t.integer :originator_id # 発信者のuser_id 6 t.integer :recipient_id # 受信者のuser_id 7 t.integer :item_id # アイテム 8 t.integer :body_num # 対応する文言 9 t.boolean :status # 閲覧フラグ 10 t.timestamps 11 end 12 add_index :notifications, :item_id 13 add_index :notifications, :originator_id 14 add_index :notifications, :recipient_id 15 end 16end 17

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

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

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

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

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

guest

回答1

0

ベストアンサー

① notificationのレコード数が10万、100万になった場合のパフォーマンス
(多分まともに動かない気がする)

実際に10万件レコードをセットして試してみるのがよいと思います。

見た感じ"(recipient_id = ?) OR (body_num = ?)"の部分でデータベースのインデックスが効かず遅くなるかもしれないと感じました。

② 未読数を表示するためにapplication.html.erbに書いたコードが毎回呼び出されるのでパフォーマンスが。。

パフォーマンスが問題になったらキャッシュするのがよいと思います。

雑なやり方であれば、sessionに未読数と最終更新時刻を保存させて、それを表示させます。
最終更新時刻が1日より前なら(適当です)一致してないかもしれないので更新する。
NotificationsControllerindexアクションが呼ばれた時も更新する。
という方法はどうでしょう。

あるいは真面目にUserモデル内に未読件数というフィールドを作り、NotificationsControllerindexアクションで更新するなどです。

③view側で文言を振り分けているのがよくない気がする。。がどうしていいかわからない

どこを懸念しているのかわかりませんが、見た感じ問題ないように見えます。

投稿2015/07/04 09:16

編集2015/07/04 09:17
hello-world

総合スコア1342

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

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

退会済みユーザー

退会済みユーザー

2015/07/06 12:26

お礼が遅くなり申し訳有りませんでした。特に②が参考になり感謝しています。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問