Ilnar25
@Ilnar25

Как передать переменную в SQL запрос?

Order.connection.select_all("SELECT created_at::date, SUM(total_price) AS sum FROM orders WHERE store_id = 1 GROUP BY created_at::date").to_hash

Данный SQLкод прекрасно работает в консоли. Вызывать запрос прямо в контроллере выглядит грязно, куда будет правильно его вынести? Я пробовал выносить в модель Order и вызывать его через скоуп, но к сожалению я не могу передать внутрь запроса переменную, пишет что колонка "var" не существует. Как правильно поступить и передать в SQL переменную. Плиз ай нид в совете мудреца:)
scope :sum_orders, -> (var) do
    connection.select_all("SELECT created_at::date, SUM(total_price) AS sum FROM orders WHERE store_id = var GROUP BY created_at::date").to_hash
  end
  • Вопрос задан
  • 492 просмотра
Решения вопроса 1
blackst0ne
@blackst0ne
Фулстэк-разработчик
# AR
Order.where(store_id: var).group(:created_at).sum(:total_price)

# Scope 
scope :sum_orders, -> (var) { where(store_id: var).group(:created_at).sum(:total_price) }
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
@unabl4
ruby on rails web dev
По-моему, проще его на рельсах переписать.

Order.select('created_at::date, SUM(total_price) AS sum').where(store_id: var).group('created_at::date')


В scope-метод, я думаю, сам сможешь это всё дело оформить, чтоб красиво было, типо

Order.sum_orders(store_id:)

raw sql в рельсах нужен когда всё очень и очень плохо.
Настолько плохо, что запрос нельзя расписать, к примеру, в том же arel table. Это должен быть очень специфичный зверь. Всё остальное легко через ActiveRecord расписывается без особых усилий.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы