我想在循环外返回一个值。
@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上搜索,但显示的内容并不多
答案 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
#compact
在nil
与li
和method1
都不匹配的情况下,用于过滤method2
。