Spaltenreihenfolge der Ergebnisse von Schienen Active find_by_sql Aufruf
-
03-07-2019 - |
Frage
Ich versuche, gemeinsam einige grundlegenden Bericht Bildschirme zu bringen. Ich habe einige ziemlich komplizierte SQL-Abfragen, die ich in der Active find_by_sql Methode bin Fütterung. Das Problem, das ich hier bin ist, dass ich die Reihenfolge der Spalten in der ursprünglichen Abfrage als gegeben verlöre. Ich gehe davon aus, dass dies, weil die Hash-Klasse nicht Eintrag Reihenfolge ihrer Schlüssel bewahren.
Gibt es eine Möglichkeit, um dieses Problem? Sollte ich eine andere Methode verwenden, dann find_by_sql für meine Fragen?
Lösung
Sie richtig sind, dass der Ruby-Hash nicht um bewahren. Das ist ein Teil des Punktes, wirklich -. Sie Zugriff auf den Schlüssel mit
Ich nehme an, Ihre Abfrage, um die Spalten in der Reihenfolge zu liefern geschrieben, dass Sie ausgeben wollen und Sie die Werte über eine Schleife zur Ausgabe erhofften? Scheine wie eine anständige genug Idee, aber ich kann nicht einen Weg finden, ohne zumindest einige zusätzliche Arbeit zu erreichen.
Was würde ich empfehlen, ist explizit die Spalten in Ihrer Vorlage durch Schlüssel zugreifen, da Sie wahrscheinlich Arten gehen, um am Ende der Anwendung, Formatierung Hilfsfunktionen wie number_with_delimiter verwenden, diese Art der Sache.
Um so etwas wie die Verknüpfung zu erhalten oben erwähnt, nehme ich Ihnen eine Reihe von Symbolen in der Reihenfolge erforderlich und die Werte in einer Schleife aus dem Hash ziehen schaffen könnte. Etwas wie das? (Bitte auf die potenziell zwielichtige erb entschuldigen: Ich bin ein haml Benutzer)
<% for row in @report.rows %>
<tr>
<% for col in [:a, :b, :c] %>
<td><%= row[col] %></td>
<% end %>
</tr>
<% end %>
Andere Tipps
Ich mag verwenden Ruport für die Berichterstattung. Es hat eine gute Active Integration und ermöglicht es Ihnen, Spaltenreihenfolge zu steuern und so ziemlich alles andere. Und es einfach genug zu bedienen, dass ich halte es nicht übertrieben, auch für „basic“ berichtet.
In Schienen 3.2 und höher können Sie attribute_names
für jeden Datensatz von find_by_sql
Ergebnis zu erzielen.
Dies wird dokumentiert in find_by_sql :
Führt eine benutzerdefinierte SQL-Abfrage für die Datenbank und gibt alle Ergebnisse. Die Ergebnisse werden als Array mit Säulen zurückgeführt werden Verlangte als Attribute des Modells verkapselt Sie diese Methode aufrufen von. Wenn Sie
Product.find_by_sql
rufen dann werden die Ergebnisse sein in einemProduct
Objekt mit den Attributen zurückgegeben Sie in der angegebenen SQL-Abfrage.Wenn Sie eine komplizierte SQL-Abfrage aufrufen, die die mehrere Tabellen erstreckt sich über Spalten durch die SELECT angegeben werden Attribute des Modells sein, ob sie Spalten der entsprechenden Tabelle sind
Für die Modelle können Sie column_names verwenden. Für weitere Informationen zu den Änderungen finden Sie andere Antwort SA: Wie entdecken Sie Modell Attribute in Rails
Wie erstellen Sie diesen „Bericht screens“? Sind sie erb-Vorlagen? Sind Sie gerade telefonieren .each auf Spalten, um sie alle zu drucken?
Wenn das der Fall, dass Sie die Spalten außer Kraft setzen könnten () -Methode in Ihren Modellen ein geordnetes Array zurück.