2010-02-11 9 views
8

Estoy trabajando en una aplicación que tiene algunos modelos diferentes (tickets, publicaciones, informes, etc.). Los datos son diferentes en cada modelo y quiero crear un "feed" de todos esos modelos que muestre las 10 entradas más recientes en general (una combinación de todos los datos).Creación de "feeds" desde múltiples modelos diferentes de Rails

¿Cuál es la mejor manera de hacerlo? ¿Debo crear un nuevo modelo de Feed y escribir en esa tabla cuando a un usuario se le asigna un ticket o se publica un nuevo informe? También hemos estado analizando STI para crear una tabla de referencias de modelos o simplemente creando un método de clase que agregue los datos. No estoy seguro de cuál es el método más eficiente ...

Respuesta

6

Usted puede hacerlo de dos maneras dependiendo de los requisitos de eficiencia.

El método es menos eficiente para recuperar 10 * N elementos y ordenar y reducir según sea necesario:

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

Otro método es crear una tabla de índices que tiene una asociación polimórfica con los distintos registros. Si solo está interesado en mostrar 10 a la vez, puede reducirlo de forma agresiva usando algún tipo de tarea de rake para limitarlo a 10 por usuario o cualquier alcance que sea necesario.

+0

Esto funciona bien y parece moverse bastante rápido. Estaba tratando de evitar crear otro modelo. Gracias. – jsiarto

+2

hey tadman, para aquellos de nosotros interesados ​​en la segunda opción, escribí una pregunta de seguimiento aquí: http://stackoverflow.com/questions/7841553/creating-a-feed-from-multiple-rails-models-efficiently If tienes un momento, podrías ver el seguimiento? – jay

0

Cree un modelo de artículo que incluya los atributos "table_name" y "item_id". Luego crea un parcial para cada tipo de datos. Después de guardar, digamos, un billete, cree una instancia de artículo:

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

En su items_controller:

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

En vistas/artículos/index.erb:

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

Esta parece ser una forma más manual de simplemente hacer STI, ¿hay alguna ventaja en almacenar table_name, en lugar de escribir y simplemente dejar que los rieles manejen el STI? – jsiarto

Cuestiones relacionadas