3

Railsアプリで、複数のモデルを1つのアクティビティフィードに結合したいと思います。

たとえば、投稿、コメント、写真、ステータスのモデルがあります。それぞれがユーザー、機関、および都市に属しています。ユーザー/機関/都市のショーページに、最新のアクティビティの時系列リストを表示したいと思います。

SOに関する他の質問を読んだり、他の質問から、これについては2つの考え方があるようです。

  1. 多形のActivityFeedモデルを作成します。たとえば、Userhas_many :posts as: feedableです。次に、それぞれの表示ページでActivityFeedコレクションをレンダリングします。
  2. 結合された配列を作成してレンダリングします。@user_feed = @user_photos + @user_comment +..

しかし、私はそれぞれのアプローチの長所と短所についてあまり議論していません。

他の誰かが同様のことを試みましたか?アプローチを選択する際に、どのような問題について考えたり、計画したりする必要がありますか?それぞれのパフォーマンスはどれくらいですか(特にデータベースが大きくなるにつれて)?

私の要件は次のとおりです。

  1. 親モデルに属するすべてのアイテムを表示します。
  2. いくつかの異なるタイプの親モデル(ユーザー、機関、都市など)を持つこと。
  3. クラスに応じて、アクティビティフィードのアイテムごとに異なるビューを部分的にレンダリングします。

これに関する考え、個人的な経験、またはさらなる情報へのポインタに感謝します。3番目のオプションを探す必要がありますか?私は特に、いくつかのクエリから結合された配列を作成するパフォーマンスに興味があります。

ありがとう

4

1 に答える 1

3

要件にさらにいくつかの問題を追加しましょう

  1. 親モデルに属するすべてのアイテムの表示のしやすさ
  2. さまざまなタイプの親モデルを簡単に使用できるようにする
  3. クラス依存のテンプレートレンダリングの容易さ
  4. 共有アクティビティ機能のリファクタリングの容易さ
  5. 潜在的なアクティビティ制御機能の統合の容易さ(読み取り、サブスクライブ、フォロー、共有などとしてマーク)
  6. 多形フィードの計算のしやすさ、たとえばさまざまなタイプのアクティビティの時系列の逆順。
  7. 親の集計アクティビティ数の計算のしやすさ

私にとって、5と6と7のdefoは、最初のオプションを支持してそれをヒントにします、私のコードは次のようになります:

class Activity
  belongs_to :activity, polymorphic: true
  belongs_to :user, counter_cache: true
  belongs_to :institution, counter_cache: true
  belongs_to :city, counter_cache: true
end

都市ニュースフィードの範囲(1,2,6を示す)

city.activities.order('updated_at DESC').limit(20)

これは1つのテーブルでの安価な検索であり、の.includes(:activities)ようなものを表示するために関連付けの読み込み()は必要ないため、クイックリストを作成するのに十分です。

Joe from NYU, New York has posted a comment
Mel from UCL, London has added a new photo

アクティビティが別のクラスである場合、4は簡単であり、5は標準のアクティビティコントローラでもスムーズです。クイックリストビュー/アクティビティのような共有レンダリングパーシャルの場合、自然な場所になります。7はcounter_cacheで簡単に実行できます。ボーナスとして、各タイプでhas_many:activitiesを許可することにより、作成、更新、読み取りなどのアクティビティのタイプを区別できます。

お役に立てれば

于 2012-06-03T14:07:43.027 に答える