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

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

ただいまの
回答率

90.49%

  • Ruby on Rails

    7468questions

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

Rails お知らせ一覧

解決済

回答 1

投稿

  • 評価
  • クリップ 1
  • VIEW 694

smith

score 161

テラテイルのようなお知らせ一覧はどのような設計で作られているのでしょうか?
自分で考えたお知らせ一覧はモデルから対象物を検索しインスタンス化して一覧表示しています。

例:出品商品に質問があった場合
#コメントお知らせ
    user_items = Item.where(user_id: current_user.id)#ユーザの出品アイテム
    user_items_id = user_items.pluck(:id)#item_id群を取る
    @item_comment = Comment.where(item_id: user_items_id).where.not(user_id: current_user.id).page(params[:page]).per(30).order(created_at: :desc).includes(:item)

問題点
1.コメントが削除されるとお知らせ一覧からも消えしまう
2.他のモデルの更新情報と合わせて表示できない
3.お知らせ一覧を確認するたびに複数のSQLが走る

通常はどのように設計するのでしょうか?


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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 1

checkベストアンサー

0

一般的なお話をさせていただきます。

1.コメントが削除されるとお知らせ一覧からも消えしまう 

これは、動作仕様としては正しいのではないのでしょうか。
お知らせをクリックさせるとして、遷移先が削除済みなのでは、表示している意味はあまりありません。

2.他のモデルの更新情報と合わせて表示できない 

他のモデルをjoinすればよろしいかと思います。

3.お知らせ一覧を確認するたびに複数のSQLが走る 

サービス規模、サーバー資源によって方針は様々だと思います。
小規模なものでしたら、毎回お知らせを取得するのはそれほどサーバーコストはかからないでしょう。
ただ、いきなりアクセス数が増えた場合は、やはりご心配かもしれません。

次のステップとしては、キャッシュする事です。
crond等で一定時間おきにユーザー毎のお知らせ情報を集計し、memcachedでもモデルでもファイルでも良いですが、どこかしらに保存しておきます。
お知らせ一覧画面では、キャッシュしたものを表示すれば良いです。

さらに、キャッシュ処理の最中にお知らせ情報の取得要求が来たらどうするか、という問題があります。
一番簡単なのは、1ユーザーぶんの情報を更新するごとに、関連するモデルを全てロックしてしまうことです。
その時、サービスは一時的に応答がなくなりますが、それほど長い時間ではありません。
ただ、毎分更新させたい、となると、さすがに影響は出てくるかも知れません。

ここからは人によって実装方針が大きく変わってきます。
説明が楽なものを1つだけ紹介させていただきます。

キャッシュ用データ領域を2つ用意し、交互に利用します。
領域Aに書いている時は、領域Bを表示させるようにします。
領域Bに書いている時は、領域Aを表示させるようにします。
問題があるとすれば、単純にこのままでは領域Aに書き終わる前に領域Bへの書き込み処理が始まってしまうと、表示すべき領域が無くなってしまう事です。
これに対しては、どちらかが書き込み中の場合は、もう片方への書き込みを保留にする処理を加えるのが最もシンプルです。

最後に、お知らせに含まれるコメントが削除された場合、キャッシュしているお知らせからも削除する必要があります。

以上、お役に立ちますでしょうか。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2015/03/16 10:13

    ご回答いただきありがとうございます。あと一歩で解決できそうなのですが
    [2.他のモデルの更新情報と合わせて表示できない]の部分なので
    例えばオークションシステムは、入札がありました、質問がありました、落札者から評価がありました、運営からのお知らせなど異なるモデルの更新情報を時系列にして一覧でview表示しています。あの仕組みがわかりません

    キャンセル

  • 2015/03/16 21:34

    それに関しましては、お知らせ専用のモデルを作成し、コメントが投稿された時、コメントを格納するモデルに書き込むと同時に、お知らせにも、誰が誰にいつコメントした、といった情報を格納していくのです。
    同様に、入札があった場合は、入札用のモデルとは別に、お知らせ用モデルにも誰が誰にいついくらで入札した、といった情報を格納します。

    こうすれば、お知らせを取得する際は1つのモデルを参照するだけで済みます。
    後は、モデルを取得した際、どんな種類のお知らせかによって表示内容を分岐させればよろしいです。

    キャンセル

  • 2015/03/17 15:53

    やはりそういう仕組みなのですね
    1アクションで同時に二つのモデルに新規レコードを生成する方法がわからないので
    別で質問させていただくことにします。
    わからないことがわからない状況から一歩進むことができました。
    ありがとうございます。

    キャンセル

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

  • ただいまの回答率 90.49%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

  • 解決済

    Rails4 tableの初期値について

    itemを作成するとxxx modelのxxx tableが自動で作成されます。※コード1ご参照 xxx tableが作成された時にxxx tableのxカラムに item作成者の

  • 解決済

    Rails4 Whereについて

    Time.nowで取得した時刻から120秒前のまでの時刻で設定されているitemを すべて取得するのは下記のコードであっていますか? limit_day item = Item.

  • 解決済

    Rubyのあいまい検索の関連付けが上手くできません

    RubyでWebサイトを作っているのですが、そのサイトに以前ユーザーの検索機能を追加しました。 その時作ったシステムは、あいまい検索ができなかったので、あいまい検索をできるように

  • 解決済

    見栄え無視!とにかく軽くしたい

    rubyです。 0以上且つ9桁以下の整数値データを渡すと、加工して返す関数を作成しました。 行っている処理は ①送り値の数値を一桁ずつ調べていき、  1.その桁の数値が

  • 解決済

    Rails 関連付けについて

    関連付け(アソシエーション)のところでつまずいてしまったので質問させてもらいます。 今は deviseのUser(name を追加しました。) と 投稿のPost と コメントの

  • 解決済

    Railsのf.check_boxでhiddenフォームを出さない方法

    Railsのf.check_boxを利用して入力フォームを作成していますが、 このヘルパーを利用すると自動的にunchecked用のhiddenフォームが出来てしまいます。

  • 解決済

    Railsのhas_many :throughの多対多のモデルについて

    Rails4でhas_many :throughの多対多のモデルを生成しました。 Userモデル Itemモデル UserItemモデル があります。 このときi

  • 解決済

    Ruby on Rails : NoMethodError in Devise::Registrat...

    NoMethodError in Devise::RegistrationsController#create undefined method `avatar_content_t

同じタグがついた質問を見る

  • Ruby on Rails

    7468questions

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