如何在循环外返回值?

时间:2019-06-29 06:17:34

标签: ruby-on-rails ruby

我想在循环外返回一个值。

@order.cart.line_items.to_a.sum { |li|
              if li.shop_product.method_1?
                (li.shop_product.print_locations.to_a.sum { |pl| pl.vendor_price }) + li.shop_product.product.vendor_product.price_method_1
              elsif li.shop_product.method_2?
                (li.shop_product.print_locations.to_a.sum { |pl| pl.vendor_price }) + li.shop_product.product.vendor_product.price_method_2
              end
            }

这给了我我想要的价值。

在我看来,诸如:

@order.cart.line_items.to_a.sum { |li|
              if li.shop_product.method_1?
                method_1_price = (li.shop_product.print_locations.to_a.sum { |pl| pl.vendor_price }) + li.shop_product.product.vendor_product.price_method_1
              elsif li.shop_product.method_2?
               method_2_price =  (li.shop_product.print_locations.to_a.sum { |pl| pl.vendor_price }) + li.shop_product.product.vendor_product.price_method_2
              end
            }

然后使用:

price = method_1_price + method_2_price

..以获得最终价格。

如何在循环外使用循环中的值?

我尝试了第二段代码,但不允许我在循环外使用这些值。我一直在Google上搜索,但显示的内容并不多

1 个答案:

答案 0 :(得分:1)

使用#map将集合转换为值(在循环之外获取值),然后使用结果收集并执行sum

类似这样的东西:

price = @order.cart.line_items.map do |li|
  if li.shop_product.method_1?
    (li.shop_product.print_locations.to_a.sum { |pl| pl.vendor_price }) + li.shop_product.product.vendor_product.price_method_1
  elsif li.shop_product.method_2?
    (li.shop_product.print_locations.to_a.sum { |pl| pl.vendor_price }) + li.shop_product.product.vendor_product.price_method_2
  end
end.compact.sum

#compactnillimethod1都不匹配的情况下,用于过滤method2