ARel中的案例声明

问题描述 投票:1回答:1

我正在尝试使用ARel清理用MySQL案例语句编写的ActiveRecord代码。我知道Arel能够处理案例陈述,但不确定如何使用它。

所以我有一个包含数量和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")
mysql ruby-on-rails activerecord arel
1个回答
1
投票

我认为Arel v7.x引入了Arel::Nodes::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")
© www.soinside.com 2019 - 2024. All rights reserved.