gpt4 book ai didi

mysql - ARel 中的案例陈述

转载 作者:行者123 更新时间:2023-12-04 14:45:19 24 4
gpt4 key购买 nike

我正在尝试使用 ARel 清理用 MySQL case 语句编写的 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")

最佳答案

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

关于mysql - ARel 中的案例陈述,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60411301/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com