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!

Foi útil?

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!

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top