Вы можете сделать прямой 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, prepare и 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.created_at и для payment_errors.created_at.
Если нужно показать сразу много записей, а не все записи, рассмотрите возможность использования нумерации страниц:
Если вам нужно разбить на страницы, рассмотрите возможность создания представления в БД, которое сначала называется payment_records, которое объединяет таблицы payment_details и payment_errors, а затем создайте модель для представления (которое будет доступно только для чтения). Некоторые БД поддерживают материализованные представления, что может быть хорошей идеей для производительности.
Также рассмотрите спецификации оборудования или ВМ на Rails-сервере и БД-сервере, конфигурацию, дисковое пространство, скорость / задержку в сети и т. Д., Близость и т. Д. И рассмотрите возможность размещения БД на другом сервере / ВМ, чем приложение Rails, если у вас его нет, и т. Д. ,