Frage

Ich arbeite an einer Anwendung, die ein paar verschiedenen Modelle hat (Tickets, Beiträge, Berichte, etc ..). Die Daten sind unterschiedlich in jedem Modell und ich möchte eine „feed“ aus all diesen Modellen zu schaffen, dass Anzeigen für die letzten 10 Einträge auf der ganze Linie (eine Mischung aus allen Daten).

Was ist der beste Weg, um dies zu realisieren? Soll ich ein neues Feed-Modell und schreibt auf diese Tabelle erstellen, wenn ein Benutzer ein Ticket oder einen neuen Bericht zugeordnet wird gebucht? Wir haben auch bei STI gesucht eine Tabelle der Modellreferenzen zu bauen oder einfach nur eine Klassenmethode zu schaffen, der die Daten aggregiert. Nicht sicher, welche Methode ist die effizienteste ...

War es hilfreich?

Lösung

Sie können es eine von zwei Arten auf Effizienzanforderungen abhängig.

Je weniger effiziente Methode ist 10 * N Elemente abzurufen und zu sortieren und zu reduzieren, wie erforderlich:

# 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]

Eine andere Methode ist eine Indextabelle zu erstellen, dass die eine polymorphe Verbindung mit den verschiedenen Aufzeichnungen einsehen. Wenn Sie nur mit 10 zeigt, zu einem Zeitpunkt betroffen sind, können Sie aggressiv beschneiden dies eine Art Rechen Aufgabe mit es pro Benutzer auf 10 zu begrenzen, oder was auch immer Umfang erforderlich ist.

Andere Tipps

Erstellen von Artikeln Modell, das die Attribute „table_name“ und „ITEM_ID“ enthält. Dann erstellen Sie für jeden Datentyp einen Teil. Nachdem Sie sparen, sagen wir mal, ein Ticket, ein Item-Instanz erstellen:

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

In Ihrem items_controller:

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

Im Blick / Artikel / index.erb:

<% @items.each do |item| %>
  <%= render :partial => item.table_name, :locals => {:item => item} %><br />
<% end %>
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top