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
  • Вопрос задан
  • 68 просмотров
Решения вопроса 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 расписывается без особых усилий.
Ответ написан
Ваш ответ на вопрос

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

Войти через TM ID
Похожие вопросы
от 90 000 до 200 000 руб.
от 1 700 до 5 500 usd.
Randewoo.ru Москва
от 120 000 до 180 000 руб.
18 авг. 2018, в 17:54
6000 руб./за проект
18 авг. 2018, в 16:00
60000 руб./за проект