您可以使用直接SQL对两个表进行单个查询。我将提供一个干净的查询示例,希望避免人们将变量直接放入字符串本身(SQL注入危险),即使这个示例没有指定它的需要:
@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
编辑:正如Huy所说,一个简单的方法是ActiveRecord::Base.connection.execute("…")。另一种方法是ActiveRecord::Base.connection.exec_query('…').rows。你也可以使用原生的预处理语句,例如,如果使用postgres,预处理语句可以使用raw_connection、prepare和exec_prepared完成,如https://stackoverflow.com/a/13806512/178651中所述
您还可以将原始SQL片段放入ActiveRecord关系查询:http://guides.rubyonrails.org/active_record_querying.html
以及在关联、作用域等中。你可以用ActiveRecord关系查询构造相同的SQL,也可以用ARel做一些很酷的事情,Ernie在http://erniemiller.org/2010/03/28/advanced-activerecord-3-queries-with-arel/中提到过。当然,还有其他orm、宝石等。
如果这将被大量使用,并且添加索引不会导致其他性能/资源问题,那么可以考虑在DB中为payment_details添加一个索引。Created_at和for payment_errors.created_at。
如果有很多记录,而不是所有的记录需要一次显示,可以考虑使用分页:
https://www.ruby-toolbox.com/categories/pagination
https://github.com/mislav/will_paginate
如果需要分页,可以考虑先在DB中创建一个名为payment_records的视图,它将payment_details表和payment_errors表结合在一起,然后为该视图创建一个模型(该模型将是只读的)。一些db支持物化视图,这对于性能来说可能是个好主意。
还要考虑Rails服务器和DB服务器上的硬件或虚拟机规格、配置、磁盘空间、网络速度/延迟等。,邻近性等等。如果你没有,考虑把DB放在不同的服务器/VM上,而不是Rails应用,等等。