gpt4 book ai didi

ruby-on-rails - 高级 ActiveRecord 查询 : Filter Sum through Nested Associations

转载 作者:行者123 更新时间:2023-11-29 12:25:40 24 4
gpt4 key购买 nike

假设我是一个具有以下数据库结构的电子商务网站:

  • 订单有_many OrderItems
  • OrderItem belongs_to Product
  • order_items 表有一列,数量。
  • 产品表有一个列,价格。

我想在我的订单模型中创建一个范围,该范围能够按总价过滤订单。这是订单的总和(order_item 数量 * order_item 的产品价格)。

预期用途:

#Get orders that have a total cost greater than 10
Order.filter_cost('gt', 10)

这是我到目前为止形成的,但它似乎并没有完全起作用。我在想我不应该分组,但如果我不使用分组就会出错。在以下范围内,我得到了响应,但返回的集合不准确。

scope :filter_cost, (lambda do |*args|
if args[0] && %w(gt lt et).include?(args[0]) && args[1]
operator_map = { 'gt' => '>', 'lt' => '<', 'et' => '=' }
joins(order_items: :product).group('orders.id').group('order_items.id').group('products.id').having("SUM(products.price * order_items.quantity) #{operator_map[args[0]]} ?", args[1].to_f)
end
end)

关于我的查询有什么问题,我可以获得一些指导吗?

最佳答案

def self.total_cost(direction, amount)
select(orders.*, SUM(products.price * order_items.quantity) AS total_price).
joins(order_items: :product).
where(SUM(products.price * order_items.quantity) #{direction} #{amount})
end

现在您可以像 Order.total_cost(:>, 10) 这样使用它附言- 您甚至可以访问 total_amount,方法是将其作为此查询返回的实例上的方法调用。

Order.total_cost(:>, 10).first.total_cost(返回该商品的总成本)

我认为使用符号而不是 gtlt 更好,因为对于任何人来说,该方法的作用都更直接 + 你不必做不必要的映射。

可能不是最优雅的解决方案,但它确实有效。

关于ruby-on-rails - 高级 ActiveRecord 查询 : Filter Sum through Nested Associations,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39152641/

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