mysql - ARel 中的案例陈述
问题描述
我正在尝试使用 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")
解决方案
我认为从 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")
推荐阅读
- css - 在 Wordpress 投资组合列表中悬停时更改图像
- java - 如果我只调用 get、put、remove 并以线程 id 为键并且从不迭代映射,我是否需要 ConcurrentHashMap?
- ios - Visual Studio for Mac 是否支持使用分发配置文件调试 iOS 应用程序?
- react-native - create-react-native-app 打包程序在启动时卡住了
- sql - Active Record - 如果有任何子表匹配,则查询以从父表中排除条目
- android - 从最近窗格中删除应用程序后,无法从广播接收器启动活动
- dns - 领域驱动设计 - 如何聚合回合制游戏
- scala - 基于 Akka 的项目的正确解析器
- c++ - 有 cin 功能时检查用户连接
- uwp - 如何访问用户在我的 UWP 应用程序的上一个会话中选择的文件或文件夹?