Ви можете зробити прямий 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
Редагувати : як сказав Хью, простий спосіб ActiveRecord::Base.connection.execute("...")
. Інший спосіб ActiveRecord::Base.connection.exec_query('...').rows
. І ви можете використовувати власні підготовлені висловлювання, наприклад, якщо використовувати postgres, підготовлений оператор можна виконати з raw_connection, підготовкою та exec_prepared, як описано в https://stackoverflow.com/a/13806512/178651
Ви також можете розміщувати необроблені фрагменти SQL у реляційних запитах ActiveRecord: http://guides.rubyonrails.org/active_record_querying.html
та в асоціаціях, областях тощо. Можливо, ви могли б створити один і той же SQL з реляційними запитами ActiveRecord і можете робити цікаві речі за допомогою ARel, як згадує Ерні в http://erniemiller.org/2010/03/28/advanced-activerecord-3-queries-with-arel/ . І, звичайно, є інші ORM, дорогоцінні камені тощо.
Якщо це буде використовуватися багато, а додавання індексів не спричинить інших проблем із продуктивністю / ресурсом, розгляньте можливість додавання індексу в БД для Payment_details.create_at та для Payment_errors.create_at.
Якщо багато записів і не всі записи потрібно відобразити одразу, спробуйте скористатись сторінкою:
Якщо вам потрібно застосувати сторінку, розгляньте можливість створення представлення даних у БД, який спочатку називається Payment_records, який поєднує таблиці Payment_details та Payment_errors, а потім створіть модель для перегляду (який буде доступний лише для читання). Деякі БД підтримують матеріалізовані подання, що може бути хорошою ідеєю для продуктивності.
Також врахуйте технічні або технічні характеристики VM на сервері Rails та сервері БД, конфігурації, дисковому просторі, швидкості / затримці мережі / тощо., Близькості і т.д. .