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

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

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

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

Q&A

解決済

1回答

1603閲覧

Rails お知らせ一覧

smith

総合スコア73

Ruby on Rails

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

0グッド

1クリップ

投稿2015/03/15 15:55

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

例:出品商品に質問があった場合

lang

1#コメントお知らせ 2 user_items = Item.where(user_id: current_user.id)#ユーザの出品アイテム 3 user_items_id = user_items.pluck(:id)#item_id群を取る 4 @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が走る

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

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

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

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

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

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

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

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

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

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

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

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

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

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

投稿2015/03/15 18:49

terushu

総合スコア358

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

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

smith

2015/03/16 01:13

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

2015/03/16 12:34

それに関しましては、お知らせ専用のモデルを作成し、コメントが投稿された時、コメントを格納するモデルに書き込むと同時に、お知らせにも、誰が誰にいつコメントした、といった情報を格納していくのです。 同様に、入札があった場合は、入札用のモデルとは別に、お知らせ用モデルにも誰が誰にいついくらで入札した、といった情報を格納します。 こうすれば、お知らせを取得する際は1つのモデルを参照するだけで済みます。 後は、モデルを取得した際、どんな種類のお知らせかによって表示内容を分岐させればよろしいです。
smith

2015/03/17 06:53

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問