2011-10-20 9 views
7

Questo è un seguito fino a Creating "feeds" from multiple, different Rails models. In questa domanda, Tadman suggerisce questo metodo di creazione di un feed utente di elementi recenti da tre modelli (biglietteria, Post, Report):Creazione di un "feed" da più modelli di rotaie, in modo efficiente?

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

Egli suggerisce questo come un metodo che funziona, ma che non necessariamente essere il più efficiente Suggerisce inoltre che un metodo alternativo sarebbe quello di "creare un indice che abbia un'associazione polimorfica con i vari record".

Sono davvero interessato a saperne di più su questa soluzione alternativa, sembra sia più efficiente che più elegante. Qualcuno può dirmi come si farebbe questo? Usiamo le stesse informazioni di base dell'ultima domanda come base.

risposta

6

Quello che ho fatto una volta era, avere un modello separato Feed (feeds_controller) e aggiornarlo in after_save callbacks a tutti i modelli interesting. Così, per esempio, se si dispone di un modello di articolo, hanno un callback after_save:

def after_save 
    feed = Feed.new 
    feed[:model_name] = 'Article' 
    feed[:item_id] = id 
    feed.save 
end 

allora, è possibile accedere al feed in modo lineare, proprio come qualsiasi altro modello. La spesa computazionale è sostenuta quando si salva il feed, non leggendo dal feed.

Oh, è anche possibile avere Feed has_many :article; has_many :user, has_many :status e così via, quindi :include tutte quelle risorse nel feed e renderle in viste. Spero che questo abbia senso ;-)

+0

questo sembra promettente. Grazie! – jay

+0

Qualche idea su come metterlo in un controller e renderlo in una vista? non sei sicuro di cosa intendi con "allora: includi tutte quelle risorse nel feed"? – Terryfrancis

Problemi correlati