Você pode fazer o SQL direto ter uma única consulta para ambas as tabelas. Fornecerei um exemplo de consulta higienizada para evitar que as pessoas insiram variáveis diretamente na própria string (perigo de injeção de SQL), mesmo que este exemplo não tenha especificado a necessidade:
@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 : como Huy disse, é uma maneira simples ActiveRecord::Base.connection.execute("...")
. Outra maneira é ActiveRecord::Base.connection.exec_query('...').rows
. E você pode usar instruções preparadas nativas, por exemplo, se estiver usando o postgres, a instrução preparada poderá ser feita com raw_connection, prepare e exec_prepared, conforme descrito em https://stackoverflow.com/a/13806512/178651
Você também pode colocar fragmentos de SQL brutos nas consultas relacionais do ActiveRecord: http://guides.rubyonrails.org/active_record_querying.html
e em associações, escopos etc. Você provavelmente pode construir o mesmo SQL com as consultas relacionais do ActiveRecord e pode fazer coisas interessantes ARel como Ernie menciona em http://erniemiller.org/2010/03/28/advanced-activerecord-3-queries-with-arel/ . E, claro, existem outras ORMs, gemas, etc.
Se isso for usado muito e a adição de índices não causará outros problemas de desempenho / recursos, considere adicionar um índice no banco de dados para payment_details.created_at e para payment_errors.created_at.
Se muitos registros e nem todos os registros precisarem aparecer ao mesmo tempo, considere usar a paginação:
Se você precisar paginar, considere criar uma visualização no banco de dados chamada payment_records que combine as tabelas payment_details e payment_errors e, em seguida, tenha um modelo para a visualização (que será somente leitura). Alguns bancos de dados oferecem suporte a visualizações materializadas, o que pode ser uma boa idéia para desempenho.
Considere também as especificações de hardware ou VM no servidor Rails e no servidor DB, configuração, espaço em disco, velocidade / latência da rede / etc., Proximidade etc. E considere colocar o DB em um servidor / VM diferente do aplicativo Rails, se você não tiver, etc. .