Exibir todas as versões de registros individuais no Papertrail
-
11-12-2019 - |
Pergunta
Estou construindo um sistema de liga e atualmente ele armazena e atualiza o 'elo score' dos jogadores dependendo do resultado.Agora, estou tentando adicionar 'HighCharts' para exibir a pontuação elo dos jogadores ao longo da temporada em um gráfico de linhas atraente.Alguém sugeriu que eu usasse o Papertrail para armazenar as atualizações e já instalei tudo.
Agora vem o meu problema, não consigo descobrir como cuspir as versões elo_score dos usuários em um array fácil de usar pelo 'HighCharts'.Posso obter as últimas atualizações do elo_score:
Last updated score = <%= @player.versions.last.reify.elo_score %>
Mas não consigo encontrar a sintaxe para cuspir todos as 'versões' para 'elo_score'.Algo como “1000, 1020, 1043, 1020”.
Eu também tentei:
<%= @player.versions.map { |version| version.reify.elo_score} %>
Mas isso me dá um "método indefinido `elo_score' para nil:NilClass".Enquanto apenas <%= @player.versions.map { |version| version.reify %> cospe todos informações no registro e obviamente não apenas o elo_score.
Alguém pode ajudar?Desculpe se não deixei isso claro, sou totalmente novo no Rails e este é apenas um projeto divertido no meu tempo livre, mas estou me divertindo muito!
Muito obrigado!
Solução
O que você fez aqui:
@player.versions.map { |version| version.reify.elo_score }
É perfeitamente normal pegar todas essas pontuações e colocá-las em uma matriz.O problema que você está enfrentando (o nil:NilClass
coisas) está chegando porque pelo menos um reify
é nulo.Ou seja, alguma versão não possui reificação.
Se cada versão deve ter um reify, adicione-o como uma validação de modelo e encontre em seu código onde o reify está sendo definido e veja por que é nulo.
Se estiver tudo bem para uma versão ter uma reificação nula, você pode fazer isso de várias maneiras, mas a maneira direta e explícita seria assim:
elo_scores = []
@player.versions.each do |version|
unless version.reify.nil?
elo_scores << version.reify.elo_score
end
end
Eu sugeriria colocar isso em um método, como get_elo_scores
, e então você poderia chamá-lo mais facilmente como:
@player.get_elo_scores
EDITAR Para esclarecimentos dos comentários:
Seu modelo User (ou modelo Player, seja qual for o nome que você deu) deve ter um método parecido com este:
def get_elo_scores
elo_scores = []
self.versions.each do |version|
unless version.reify.nil?
elo_scores << version.reify.elo_score
end
end
return elo_scores
end
Peço desculpas por não deixar isso mais claro, mas você não terá acesso a @player
dentro deste método porque isso só existe no contexto do seu controlador e visualização.O acima é agora um método de instância adequado:ele vai ligar .versions
sobre si mesmo, e o resto está bem.Também adicionei uma chamada de retorno explícita no final.
Agora você poderá ligar @player.get_elo_scores
em qualquer objeto Usuário (ou Jogador).
Espero que ajude!