Sie können Direct SQL ausführen, um eine einzige Abfrage für beide Tabellen zu erhalten. Ich werde ein Beispiel für eine bereinigte Abfrage bereitstellen, um zu verhindern, dass Benutzer Variablen direkt in die Zeichenfolge selbst einfügen (SQL-Injection-Gefahr), obwohl in diesem Beispiel nicht angegeben wurde, dass dies erforderlich ist:
@results = []
ActiveRecord::Base.connection.select_all(
ActiveRecord::Base.send(:sanitize_sql_array,
["... your SQL query goes here and ?, ?, ? are replaced...;", a, b, c])
).each do |record|
# instead of an array of hashes, you could put in a custom object with attributes
@results << {col_a_name: record["col_a_name"], col_b_name: record["col_b_name"], ...}
end
Edit : wie Huy sagte, ist ein einfacher Weg ActiveRecord::Base.connection.execute("...")
. Ein anderer Weg ist ActiveRecord::Base.connection.exec_query('...').rows
. Sie können native vorbereitete Anweisungen verwenden, z. B. wenn Sie postgres verwenden. Die vorbereitete Anweisung kann mit raw_connection, prepare und exec_prepared ausgeführt werden, wie unter https://stackoverflow.com/a/13806512/178651 beschrieben
Sie können auch rohe SQL-Fragmente in relationale ActiveRecord-Abfragen einfügen : http://guides.rubyonrails.org/active_record_querying.html
und in Zuordnungen, Bereichen usw. Sie könnten wahrscheinlich dasselbe SQL mit relationalen ActiveRecord-Abfragen erstellen und coole Dinge damit tun ARel als Ernie erwähnt in http://erniemiller.org/2010/03/28/advanced-activerecord-3-queries-with-arel/ . Und natürlich gibt es auch andere ORMs, Edelsteine usw.
Wenn dies häufig verwendet wird und das Hinzufügen von Indizes keine anderen Leistungs- / Ressourcenprobleme verursacht, sollten Sie einen Index in der Datenbank für payment_details.created_at und für success_errors.created_at hinzufügen.
Wenn viele Datensätze und nicht alle Datensätze gleichzeitig angezeigt werden müssen, sollten Sie die Paginierung verwenden:
Wenn Sie paginieren müssen, sollten Sie in der Datenbank zunächst eine Ansicht mit dem Namen "payment_records" erstellen, die die Tabellen "pay_details" und "payment_errors" kombiniert, und dann ein Modell für die Ansicht erstellen (das schreibgeschützt ist). Einige DBs unterstützen materialisierte Ansichten, was für die Leistung eine gute Idee sein könnte.
Berücksichtigen Sie auch Hardware- oder VM-Spezifikationen auf dem Rails-Server und dem DB-Server, die Konfiguration, den Speicherplatz, die Netzwerkgeschwindigkeit / -latenz usw., die Nähe usw. und erwägen Sie, die DB auf einem anderen Server / einer anderen VM als der Rails-App zu installieren, falls dies nicht der Fall ist .