2010-02-11 27 views
8

Birkaç farklı modele sahip bir uygulama üzerinde çalışıyorum (biletler, yayınlar, raporlar, vb ..). Veriler her modelde farklıdır ve tüm bu modellerden, panodaki en yeni 10 girdiyi (tüm verilerin karışımı) gösteren bir "besleme" oluşturmak istiyorum.Birden çok farklı Rails modelinden "beslemeleri" oluşturma

Bu konuda gitmenin en iyi yolu nedir? Yeni bir Feed modeli oluşturmalı ve bir kullanıcıya bir bilet atandığında veya yeni bir rapor gönderildiğinde bu tabloya yazmalı mıyım? Ayrıca, STI'ya model referanslar tablosu oluşturmak veya sadece verileri bir araya getiren bir sınıf yöntemi oluşturmak için bakıyorduk. Hangi yöntemin en verimli olduğuna emin değilsiniz ...

cevap

6

Sen Verimlilik gereksinimlerine bağlı olarak iki yoldan birini yapabilir. gerektiği gibi

az verimli yöntem 10 * N öğeleri almak ve sıralama ve düşürmektir:

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

başka yöntem çeşitli kayıtlarla bir polimorfik ilişki var bir dizin tablosu oluşturmaktır. Bir seferde sadece 10 gösterme ile ilgiliyseniz, bunu kullanıcı başına 10'a sınırlamak için bir tür sorgulama görevi veya herhangi bir kapsam gerekmeksizin agresif bir şekilde ayarlayabilirsiniz.

+0

Bu iyi çalışıyor ve oldukça hızlı hareket ediyor gibi görünüyor. Başka bir model yaratmaktan kaçınmaya çalışıyordum. Teşekkürler. – jsiarto

+2

hey tadman, ikinci seçenekle ilgilenenler için, burada bir takip sorusu yazdım: http://stackoverflow.com/questions/7841553/creating-a-feed-from-multiple-rails-models-efficient Bir dakikan var, takibi kontrol edebilir misin? – jay

0

"table_name" ve "item_id" niteliklerini içeren bir Item modeli oluşturun. Sonra her veri türü için bir kısmi oluşturun. senin items_controller olarak

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

: görüntüleme/kalemleri/index.erb olarak

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

: Kayıt işleminden sonra, bir Öğe örneği oluşturun, en, bir bilet diyelim

<% @items.each do |item| %> 
    <%= render :partial => item.table_name, :locals => {:item => item} %><br /> 
<% end %> 
+0

Bu sadece STI yapmak için daha elverişli bir yol gibi görünüyor, tip yerine ve sadece STI işlemek için izin vermek yerine table_name depolamak için bir avantaj var mı? – jsiarto

İlgili konular