Pergunta

Estou trabalhando em um aplicativo que possui alguns modelos diferentes (ingressos, postagens, relatórios, etc.). Os dados são diferentes em cada modelo e quero criar um "feed" a partir de todos os modelos que exibem as 10 entradas mais recentes em geral (uma mistura de todos os dados).

Qual é a melhor maneira de fazer isso? Devo criar um novo modelo de feed e escrever para essa tabela quando um usuário recebe um ticket ou um novo relatório é publicado? Também procuramos o STI para construir uma tabela de referências de modelo ou apenas criar um método de classe que agregue os dados. Não tenho certeza de qual método é o mais eficiente ...

Foi útil?

Solução

Você pode fazer isso de duas maneiras, dependendo dos requisitos de eficiência.

O método menos eficiente é recuperar 10 * n itens e classificar e reduzir conforme necessário:

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

Outro método é criar uma tabela de índice que tenha uma associação polimórfica com os vários registros. Se você está preocupado apenas em mostrar 10 de cada vez, poderá podar isso agressivamente usando algum tipo de tarefa de rake para limitá -lo a 10 por usuário ou qualquer que seja necessário.

Outras dicas

Crie um modelo de item que inclua os atributos "tabela_name" e "item_id". Em seguida, crie um parcial para cada tipo de dados. Depois de salvar, digamos, um ingresso, crie uma instância do item:

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

Em seus itens_controller:

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

Em visualizações/itens/index.erb:

<% @items.each do |item| %>
  <%= render :partial => item.table_name, :locals => {:item => item} %><br />
<% end %>
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top