2011-10-20 10 views
7

To jest kontynuacja do Creating "feeds" from multiple, different Rails models. W tym pytaniu tadman sugeruje ten sposób tworząc kanał obsługi najnowszych pozycji z trzech modeli (bilet, Post, sprawozdanie):Efektywne tworzenie "feedu" z wielu modeli szyn?

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

Sugeruje to jako metodę, która będzie działać, ale niekoniecznie być najbardziej wydajnym. Sugeruje również, że alternatywną metodą byłoby "stworzenie tabeli indeksów, która ma polimorficzny związek z różnymi zapisami".

Jestem naprawdę zainteresowany tym, aby dowiedzieć się więcej o tym alternatywnym rozwiązaniu, wydaje się być bardziej wydajny i bardziej elegancki. Czy ktoś może mi powiedzieć, jak to zrobić? Wykorzystajmy te same podstawowe informacje z ostatniego pytania jako podstawy.

Odpowiedz

6

Co kiedyś zrobiłem, mam osobny model Feed (feeds_controller) i aktualizuję go w callbackach after_save do wszystkich modeli interesting. Tak na przykład, jeśli masz model artykułu, mają after_save callback:

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

następnie można uzyskać dostęp do paszy liniowo, tak jak każdy inny model. Koszty obliczeniowe są ponoszone podczas zapisywania kanału, a nie odczytu z kanału.

Och, możesz także mieć Feed has_many :article; has_many :user, has_many :status itd., A następnie :include wszystkie te zasoby w kanale i renderować je w widokach. Mam nadzieję, że to ma sens ;-)

+0

to wygląda obiecująco. dzięki! – jay

+0

Jakieś pomysły, jak umieścić to w kontrolerze i renderować w widoku? nie wiesz, co masz na myśli przez "wtedy: uwzględnij wszystkie te zasoby w kanale"? – Terryfrancis

Powiązane problemy