Заявления по делу в ARel - PullRequest
       19

Заявления по делу в ARel

1 голос
/ 26 февраля 2020

Я пытаюсь очистить код ActiveRecord, написанный с помощью MySQL операторов case, используя ARel. Я знаю, что Arel может обрабатывать операторы case, но не уверен, как его использовать.

Так что у меня есть таблица заказов с количеством и столбцами user_id (внешний ключ). Я динамически вычисляю цену заказов, поскольку существуют разные схемы ценообразования в зависимости от заказанного количества. Вот как выглядит код AR:

def orders_with_price
  <<-SQL
   orders.*, 
   SUM(CASE orders.quantity
   WHEN 2 THEN 500 * orders.quantity   
   WHEN 5 THEN 450 * orders.quantity
   WHEN 10 THEN 350 * orders.quantity
   END) AS total_price
  SQL
end


Order.
select(orders_with_price).
group("orders.user_id").
having("total_price > ?", minimum_price).
order("total_price")

1 Ответ

3 голосов
/ 26 февраля 2020

Я думаю, что из Arel v7.x введено Arel :: Nodes :: Case , которое можно использовать для операторов case. Вы можете переписать этот запрос как:

def case_statements
  orders = Order.arel_table
  Arel::Nodes::Case.
  new(orders[:quantity]).
  when(2).then(orders[:quantity] * 500).
  when(5).then(orders[:quantity] * 450).
  when(10).then(orders[:quantity] * 350)
end
orders = Order.arel_table

Order.
select(Arel.star).
select(Arel::Nodes::Sum.new(case_statements).as("total_price")).
group(orders[:user_id]).
having("total_price > ?", minimum_price).
order("total_price")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...