Puede hacer que SQL directo tenga una única consulta para ambas tablas. Proporcionaré un ejemplo de consulta desinfectado para evitar que las personas pongan variables directamente en la cadena (peligro de inyección SQL), aunque este ejemplo no especificó la necesidad de ello:
@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
Editar : como dijo Huy, una forma simple es ActiveRecord::Base.connection.execute("...")
. Otra forma es ActiveRecord::Base.connection.exec_query('...').rows
. Y puede usar declaraciones preparadas nativas, por ejemplo, si usa postgres, la declaración preparada se puede hacer con raw_connection, prepare y exec_prepared como se describe en https://stackoverflow.com/a/13806512/178651
También puede colocar fragmentos SQL sin procesar en consultas relacionales de ActiveRecord: http://guides.rubyonrails.org/active_record_querying.html
y en asociaciones, ámbitos, etc. Probablemente podría construir el mismo SQL con consultas relacionales de ActiveRecord y puede hacer cosas interesantes con ARel como Ernie menciona en http://erniemiller.org/2010/03/28/advanced-activerecord-3-queries-with-arel/ . Y, por supuesto, hay otros ORM, gemas, etc.
Si esto se va a usar mucho y agregar índices no causará otros problemas de rendimiento / recursos, considere agregar un índice en la base de datos para payment_details.created_at y para payment_errors.created_at.
Si es necesario mostrar muchos registros y no todos a la vez, considere usar la paginación:
Si necesita paginar, considere crear una vista en la base de datos primero llamada payment_records que combine las tablas payment_details y payment_errors, luego tenga un modelo para la vista (que será de solo lectura). Algunos DB admiten vistas materializadas, lo que podría ser una buena idea para el rendimiento.
Considere también las especificaciones de hardware o VM en el servidor Rails y el servidor DB, la configuración, el espacio en disco, la velocidad / latencia de la red / etc., la proximidad, etc. Y considere colocar DB en un servidor / VM diferente a la aplicación Rails si no lo ha hecho, etc. .