2012-02-15 4 views
3

ニュースフィードを作成する最も良い方法は何ですか?多くの結合ステートメントなしでニュースフィードを作成するには

現在、私は、誰かがレコードを作成するたびに、新しいnewsfeedactivityレコードを作成するオブザーバーを持っています。しかし、プライバシを処理するためには、適切な出力を得るために7〜8個の結合が必要です。

これは遅くて非効率的なようです。スコープとして適切なnewsfeedactivityレコードを引き出すためのもう1つの戦略は何ですか?


詳細:

は現在、私は、ユーザーが、彼らが取り組んでいるプロジェクトを追跡するのに役立つサイトを持っています。公開プロジェクトと非公開プロジェクト(共同作業者を招待できる場所)があります。

パブリックプロジェクトの作成時にニュースフィードに含めたい。あなたが私的プロジェクトに招待されたとき。ユーザーがプロジェクトに従うとき。そしてあなたが従っている他のユーザーのすべての行動。それからプライベートプロジェクトでは、誰がプロジェクトにアクセスできるかを決定する別のテーブルを持っています。 (これらのプロジェクトのそれぞれについては、ニュースフィードにも掲載したいコメントもあります)。

現在、次のすべての関係が結合表にあります。そのため、多くの結合があります。

クエリの種類のアイデアを取得するには - 私はそれがこのようなものに見えるだろうと考えています:。

news_feed_activitiesを選択する* news_feed_activities左からはnews_feed_activities .following_id = user_following_relationships ON user_following_relationshipsを登録しよう。 user_idはLEFTは user_project_relationships .project_id = news_feed_activities .responding_to_idと news_feed_activities .responding_to_type = 'プロジェクト' ON user_project_relationshipsを登録しよう (user_following_relationships .user_id = 1 OR user_project_relationships .user_id = 1 OR news_feed_activities .user_id = 1 OR up2を.user_id = 1)news_feed_activities .ID ORDER BY GROUP news_feed_activities


DESC

.ID BY編集: 私はおそらくこれらの行に沿ってレディスを使用して終了するつもりだと思う。 http://blog.waxman.me/how-to-build-a-fast-news-feed-in-redis

+0

これは参考になるかもしれません:http:// stackoverflow。com/questions/3809430/implementation-a-news-feed-activity-feed-on-several-models-recommend –

+0

ありがとうございました。私は最初に自分のニュースフィードを作成していたときに使っていました。パーソナライゼーションやプライバシーの設定がない場合は素晴らしい機能です。私はプライバシーの設定に取り組もうとしていますし、すべてのニュースフィード活動記録を効率的にフィルタリングする方法がわかりません(私はスコープが必要なページ付けをしたいと思っています)。 – Cyrus

+0

(単純な)プライバシー設定についての私の最初の考えは、結合が必要な追加のテーブルを追加するのではなく、テーブル内にいくつかのフラグまたはステータスカラムを使用することです。 7つか8つの結合(=追加のテーブル?)は、そのようなタスクのためにたくさんのように聞こえる。あなたは私たちにあなたの必要条件に関するより多くの情報を提供して、役に立つ反応を得るべきです。一般的に、インデックスが適切に設定されている限り、いくつかの結合テーブルについて心配する必要はありません。 –

答えて

0

としてRoR。お使いのコントローラで

@user = current_user # (?) 
recent_since = 24.hours.ago 
@news_feed = [] 

# 1) I want my newsfeed to include when public projects are created. 
@news_feed += Project.recent.open 
# 2) When you are invited to a private project. 
@news_feed += @user.invites.received.pending 
# 3) When a user follows a project. 
@news_feed += @user.user_following_relationships.recent 
# 4) And then all of the actions of the other users that you're following. 
@news_feed += @user.follows.collect(&:activities) 
# 5) Then for the private projects I have another join table to determine who has access to the projects. (There are also comments on each of these projects that I want to show up in the newsfeed as well). 
@news_feed += @user.projects.closed 

@news_feed.sort!{ |a,b| a.created_at <=> b.created_at } 

私はあまりにもあなたのためにいくつかのサンプルのスコープをしました。これはあなたのニュースフィードではなく「ニュースフィード」モデルを持つよりも、実際にはモデル間での最近の活動の概要がある教訓に基づいています

scope :recent, :conditions => ["created_at >= ?", 24.hours.ago] 
scope :open, :conditions => "publicity = 'Public'" 
scope :closed, :conditions => "publicity = 'Private'" 

project.rb。

+0

これはあなたが尋ねてきたものではなかった場合、私は必要に応じて修正します – TomDunning

+0

あなたの答えに感謝しますが、これは私が探しているものではありません。私はnewsfeedというスコープを持っています。だから、私はニュースフィードを通して改ページすることができます。このアプローチは、私が最後の日に活動をリストアップしようとした場合にはうまくいくように思えますが、ユーザが一度に30個のニュースフィード活動項目を取得して、過去にページングすることはできません。 – Cyrus

+0

ok、単純な変更:1) '最近の'要件を削除する、2)追加: '@news_feed = @ news_feed.paginate:page => params [:page]' – TomDunning

関連する問題