Pergunta

Eu estou tentando juntar algumas telas básicas de relatório. Eu tenho algumas consultas SQL bastante complicada que eu estou alimentando no método find_by_sql do ActiveRecord. O problema que estou tendo aqui é que eu estou perdendo a ordem das colunas como dado na consulta original. Estou assumindo que este é porque a classe Hash não preservar a ordem entrada de suas chaves.

Existe uma maneira de contornar este problema? Deveria eu estar usando um método diferente, então find_by_sql para minhas consultas?

Foi útil?

Solução

Você está correto em que Ruby Hash não preservar a ordem. Isso é parte do ponto, realmente -. Você acessá-lo usando a tecla

Eu assumo sua consulta é escrito para entregar as colunas na ordem em que você quer para a saída deles e você estava esperando para a saída dos valores através de um loop? Parece ser uma idéia bastante decente, mas eu não consigo pensar em uma maneira de alcançá-lo sem pelo menos algum trabalho extra.

O que eu recomendo é acessar explicitamente as colunas de chave em seu modelo, desde que você provavelmente vai acabar aplicando estilos, formatação usando funções auxiliares como number_with_delimiter, esse tipo de coisa.

Para obter algo como o atalho mencionado acima, eu suponho que você poderia criar uma matriz de símbolos na ordem requerida e puxar os valores para fora do hash em um loop. Algo assim? (Por favor, desculpe o erb potencialmente desonesto: Eu sou um haml usuário)

<% for row in @report.rows %>
    <tr>
    <% for col in [:a, :b, :c] %>
        <td><%= row[col] %></td>
    <% end %>
    </tr>
<% end %>

Outras dicas

Eu gosto de usar Ruport para relatar. Ele tem uma boa integração ActiveRecord e permite que você controle a ordem das colunas e praticamente qualquer outra coisa. E é suficientemente simples de usar que eu não considero isso um exagero, mesmo para relatórios "básicos".

No Rails 3.2 e superior, você pode usar attribute_names para cada registro de resultados find_by_sql. Isso está documentado no find_by_sql :

Executa uma consulta SQL personalizada contra o seu banco de dados e retorna todos os resultados. Os resultados serão apresentados como uma matriz com colunas solicitou encapsulado como atributos do modelo que você chamar esse método de. Se você chamar Product.find_by_sql em seguida, os resultados serão retornado em um objeto Product com os atributos especificados no SQL consulta.

Se você chamar uma consulta SQL complicado que se estende por várias tabelas das colunas especificadas pela seleciona será atributos do modelo, se eles são ou não colunas da tabela correspondente

Para modelos que você pode usar COLUMN_NAMES. Para mais informações sobre as variações ver outra resposta SA: Como você descobre modelo atributos em Rails

Como você está criando esses "telas do relatório"? São eles erb modelos? Você está apenas chamando .each em colunas para imprimi-los todos para fora?

Se for esse o caso, você poderia substituir as colunas () em seus modelos para retornar uma matriz ordenada.

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