Pregunta

Estoy intentando juntar algunas pantallas de informe básicas. Tengo algunas consultas SQL bastante complicadas que estoy introduciendo en el método find_by_sql de ActiveRecord. El problema que tengo aquí es que estoy perdiendo el orden de las columnas como se indica en la consulta original. Supongo que esto se debe a que la clase Hash no conserva el orden de entrada de sus claves.

¿Hay alguna forma de evitar este problema? ¿Debo usar un método diferente que find_by_sql para mis consultas?

¿Fue útil?

Solución

Tienes razón en que Ruby Hash no conserva el orden. Eso es parte del punto, en realidad: se accede con la tecla.

Supongo que su consulta está escrita para entregar las columnas en el orden en que desea generarlas y esperaba generar los valores a través de un bucle. Parece una idea bastante decente, pero no puedo pensar en una manera de lograrlo sin al menos un poco de trabajo extra.

Lo que recomendaría es acceder explícitamente a las columnas por clave en su plantilla, ya que probablemente terminará aplicando estilos, formateando utilizando funciones auxiliares como number_with_delimiter, ese tipo de cosas.

Para obtener algo como el acceso directo mencionado anteriormente, supongo que podría crear una matriz de símbolos en el orden requerido y extraer los valores del hash en un bucle. ¿Algo como esto? (por favor, disculpe el error potencialmente dudoso: ¡soy un haml usuario!)

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

Otros consejos

Me gusta usar Ruport para informar. Tiene una buena integración de ActiveRecord y le permite controlar el orden de las columnas y prácticamente cualquier otra cosa. Y es lo suficientemente simple de usar que no lo considero excesivo incluso para "básico". informes.

En los rieles 3.2 y superiores puede usar attribute_names para cada registro de resultados de find_by_sql . Esto está documentado en find_by_sql :

  

Ejecuta una consulta SQL personalizada en su base de datos y devuelve todos los   resultados Los resultados se devolverán como una matriz con columnas.   Solicitado encapsulado como atributos del modelo al que llama este método.   desde. Si llama a Product.find_by_sql , los resultados serán   devuelto en un objeto Product con los atributos que especificó en el   Consulta SQL.

     

Si llama a una consulta SQL complicada que abarca varias tablas, el   Las columnas especificadas por SELECT serán atributos del modelo,   sean o no columnas de la tabla correspondiente

Para los modelos puedes usar nombres de columna. Para obtener más información sobre las variaciones, consulte otra respuesta de SA: ¿Cómo descubre el modelo? atributos en Rails

¿Cómo está creando estas " pantallas de informe " ;? ¿Son plantillas erb? ¿Estás llamando a .each en las columnas para imprimirlas todas?

Si ese es el caso, podría anular el método columnas () en sus modelos para devolver una matriz ordenada.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top