8

いくつかの異なるモデル (チケット、投稿、レポートなど) を持つアプリケーションに取り組んでいます。モデルごとにデータが異なるため、すべてのモデルから、最新の 10 個のエントリ (すべてのデータの組み合わせ) を表示する「フィード」を作成したいと考えています。

これについて最善の方法は何ですか?ユーザーにチケットが割り当てられたとき、または新しいレポートが投稿されたときに、新しいフィード モデルを作成してそのテーブルに書き込む必要がありますか? また、STI を使用してモデル参照のテーブルを作成したり、データを集約するクラス メソッドを作成したりすることも検討しています。どの方法が最も効率的かはわかりません...

4

2 に答える 2

6

効率の要件に応じて、2 つの方法のいずれかを実行できます。

効率の悪い方法は、10 * N 個のアイテムを取得し、必要に応じて並べ替えと削減を行うことです。

# Fetch 10 most recent items from each type of object, sort by
# created_at, then pick top 10 of those.
@items = [ Ticket, Post, Report ].inject([ ]) do |a, with_class|
  a + with_class.find(:all, :limit => 10, :order => 'created_at DESC')
end.sort_by(&:created_at).reverse[0, 10]

もう 1 つの方法は、さまざまなレコードとの多態的な関連付けを持つインデックス テーブルを作成することです。一度に 10 個しか表示しない場合は、なんらかの rake タスクを使用してこれを積極的にプルーニングし、ユーザーごとに 10 個、または必要なスコープに制限することができます。

于 2010-02-11T21:31:26.167 に答える
0

属性「table_name」と「item_id」を含む Item モデルを作成します。次に、データ型ごとにパーシャルを作成します。たとえば、チケットを保存した後、Item インスタンスを作成します。

i = Item.create(:table_name => 'tickets', :item_id => @ticket.id)

あなたのitems_controllerで:

def index
   @items = Item.find(:all, :order => 'created_on DESC')
end

ビュー/アイテム/index.erb:

<% @items.each do |item| %>
  <%= render :partial => item.table_name, :locals => {:item => item} %><br />
<% end %>
于 2010-02-11T18:31:16.840 に答える