Вы можете сделать прямой 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.created_at и для payment_errors.created_at.
Если много записей, а не все записи должны отображаться сразу, рассмотреть вопрос об использовании пагинации:
Если вам нужно постраничные, рассмотреть вопрос о создании вида в БД сначала называется payment_records, который объединяет таблицы payments_details и payments_errors, а затем имеет модель для представления (которая будет доступна только для чтения). Некоторые БД поддерживают материализованные представления, что может быть хорошей идеей для производительности.
Также рассмотрите аппаратные или виртуальные спецификации на сервере Rails и сервере БД, конфигурации, дискового пространства, скорости сети/времени ожидания и т. Д., Близости и т. Д. И рассмотрите возможность размещения БД на разных серверах/виртуальных машинах, чем приложение Rails, если вы «т, и т.д.
Почему, по вашему мнению, необработанный SQL будет быстрее? Как вы знаете его проблему SQL? –
Не видя плана запроса, я бы предположил, что проблема, с которой вы сталкиваетесь, - это упорядочить по create_at. Вероятно, вы выполняете seq-сканирование по всем целым таблицам (а также в таблице проектов). Выполнение двух из тех, которые когда-то были методом контроллера на большой таблице и недостаточно мощной БД (базы данных герою настраиваются в целом и относительно недостаточны для потраченного вами $$), вы, скорее всего, получите тайм-ауты. Если вы не делаете много вставок в эти таблицы, вы можете сделать отсортированный индекс: https://devcenter.heroku.com/articles/postgresql-indexes#sorted-indexes –
Ну, всегда было бы быстрее вручную разрезать sql (если вы знаете, что делаете). Rails делает действительно неприятный sql. Он работает хорошо, но, чтобы быть общим, он должен ... быть общим. Тем не менее, Джим, вероятно, прав. Создание индексации было бы лучше. Попробуйте запустить ваш запрос в pgadmin (против вашего db) – baash05