Как я могу преобразовать этот код в raw sql и использовать в rails? Потому что, когда я внедряю этот код в heroku, возникает ошибка тайм-аута запроса. Я думаю, что это будет быстрее, если я использую raw sql.
@payments = PaymentDetail.joins(:project).order('payment_details.created_at desc')
@payment_errors = PaymentError.joins(:project).order('payment_errors.created_at desc')
@all_payments = (@payments + @payment_errors)
sql
ruby-on-rails
Джонни Кэш
источник
источник
Ответы:
Ты можешь сделать это:
records_array
будет тогда результатом вашего sql-запроса в массиве, который вы можете перебрать.источник
records_array
будет разных типов для разных адаптеров базы данных. Если вы используете PG, это будет экземплярPG::Result
, а неArray
.values
этотPG::Result
объект, чтобы получить массив результатовActiveRecord::Base.connection.exec_query
больше, потому что он возвращаетActiveRecords::Result
объект, который имеет удобные методы, такие как.columns
и.rows
для доступа к заголовкам и значениям. Массив хэшей от.execute
может быть проблематичным, и он дал мне избыточные результаты, когда я запустил предложение SUM GROUP BY.Я знаю, что это старый ... Но у меня была та же проблема сегодня и нашел решение:
Если вы хотите создать экземпляр результатов:
Если вы просто хотите хэш значений:
Объект результата:
select_all
возвращаетresult
объект. Вы можете делать магические вещи с ним.Источники:
источник
#find_by_sql
это именно то, что я хотел, большое спасибо.Вы можете выполнить необработанный запрос, используя
ActiveRecord
. И я предложу пойти с блоком SQLисточник
SELECT * FROM users WHERE users.id = #{ user.id }
Вы можете сделать прямой SQL, чтобы иметь один запрос для обеих таблиц. Я приведу пример очищенного запроса, который, как мы надеемся, не позволит людям помещать переменные непосредственно в саму строку (опасность внедрения SQL), хотя в этом примере не указана необходимость в этом:
Редактировать : как сказал Хай, простой способ
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, если у вас его нет, и т. Д. ,
источник
Я хочу работать с
exec_query
этимActiveRecord
классом, потому что он возвращает отображение запроса, преобразующегося в объект, поэтому становится очень практичным и продуктивным выполнять итерации с объектами, когда объектом является Raw SQL.Пример:
и вернуть этот полный запрос:
Получить только список значений
Получить только поля столбцов
источник
Вы также можете смешивать сырой SQL с условиями ActiveRecord, например, если вы хотите вызвать функцию в условии:
источник