【问题标题】:Case Statements in ARelARel 中的案例陈述
【发布时间】:2020-02-26 10:02:16
【问题描述】:

我正在尝试使用 ARel 清理使用 MySQL 案例语句编写的 ActiveRecord 代码。我知道 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")

【问题讨论】:

    标签: mysql ruby-on-rails activerecord arel


    【解决方案1】:

    我认为从 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")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-04-10
      • 2010-10-30
      • 2016-05-13
      • 2016-02-21
      • 1970-01-01
      • 2015-01-24
      • 2020-03-28
      相关资源
      最近更新 更多