Her iki tablo için tek bir sorguya sahip olmak için doğrudan SQL yapabilirsiniz. Bu örnek için ihtiyacı belirtmedi olsa bile, insanların değişkenleri doğrudan dizenin içine (SQL enjeksiyon tehlikesi) koyarak umarım temizlenmiş bir sorgu örneği sağlayacaktır:
@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
Düzenleme : Huy'un dediği gibi, basit bir yol ActiveRecord::Base.connection.execute("...")
. Başka bir yol ActiveRecord::Base.connection.exec_query('...').rows
. Ve yerel hazırlanmış ifadeler kullanabilirsiniz, örneğin postgres kullanılıyorsa hazırlanmış deyim, htt_://stackoverflow.com/a/13806512/178651 adresinde açıklandığı gibi raw_connection, ready_prepared ile yapılabilir.
Ham SQL parçalarını ActiveRecord ilişkisel sorgularına da koyabilirsiniz: http://guides.rubyonrails.org/active_record_querying.html
ve ilişkilendirmelerde, kapsamlarda vb. Muhtemelen aynı SQL'i ActiveRecord ilişkisel sorgularıyla oluşturabilir ve Ernie olarak ARel, http://erniemiller.org/2010/03/28/advanced-activerecord-3-queries-with-arel/ adresinde bahsedilmektedir . Ve elbette başka ORM'ler, taşlar vb.
Bu çok kullanılacaksa ve endeks eklemek diğer performans / kaynak sorunlarına neden olmazsa, DB'ye payment_details.created_at ve payment_errors.created_at için bir dizin eklemeyi düşünün.
Tüm kayıtların aynı anda gösterilmesi gerekmiyorsa, sayfa numaralandırmayı kullanmayı düşünün:
Sayfalandırmanız gerekirse, önce DB'de payment_details ve payment_errors tablolarını birleştiren bir görünüm oluşturmayı ve ardından görünüm için bir model oluşturmayı (salt okunur olacak) düşünün. Bazı DB'ler performans için iyi bir fikir olabilecek materyalize görünümleri destekler.
Ayrıca Rails sunucusu ve DB sunucusu, yapılandırma, disk alanı, ağ hızı / gecikme / vb., Yakınlık, vb. Donanım veya VM özelliklerini de göz önünde bulundurun. .