Esta implementação é para exibir as atividades da rede “social” de um usuário, pressupondo que você tenha um relacionamento “seguir” funcional, como o Twitter. Configurar isso é um fluxo de trabalho separado. Eu uso isso na visualização do painel do usuário.
Primeiro, precisamos reunir todas as “atividades”. No meu aplicativo, as atividades consistem em criar novas pontuações e dicas . Iremos iterar através da rede do usuário e coletar todas essas atividades em um array armazenado em @activities .
Em user.rb
def get_network_activity
@activities = []
@follows = self.follows.all
@follows.each do |f|
f.venue_scores.each do |a|
@activities << a
end
f.tips.each do |t|
@activities << t
end
end
@activities
end
Agora temos todas as nossas atividades coletadas na variável @activities disponível para a visualização. Na visualização, iremos iterar através da matriz de atividades e determinar nossa formatação e / ou conteúdo relacionado verificando a classe de cada atividade, colocando o conteúdo interpolado onde quisermos. (Desculpas, este código de visualização está em Slim. Vou postar novamente no ERB em uma data posterior.)
Em show.rb
- activity = resource.get_network_activity
- activity.each do |a|
- if a.class == VenueScore
td = "#{User.find(a.user_id).first_name} posted a score of #{a.computed_score} to #{Venue.find(a.venue_id).name }."
- elsif a.class == Tip
td = "#{User.find(a.user_id).first_name} posted a tip to #{Venue.find(a.venue_id).name}."
Neste exemplo, o feed de atividade faz parte de uma tabela existente e cada atividade é inserida como um <td>. É importante notar que esta é uma implementação muito direta, como se a rede de um usuário fosse grande ou seu aplicativo fosse maduro, @activities pode crescer para conter quantidades excessivas de dados. Posteriormente, postarei uma implementação que define o escopo de nossas atividades para um período de tempo desejado, limitando os dados retornados em nosso array.
Espero que você ache isso útil! Sinta-se à vontade para me deixar uma mensagem no Twitter em @justinraczak se você quiser conversar sobre isso ou tiver outras idéias.