[英]How to improve Ruby structure for Shopify Script Performance
我在 Shopify 脚本编辑器中使用 Ruby 来作为安全措施管理购买赠品 (GWP) 促销活动。
当前的脚本是:
GWP_SETTINGS = []
obj 中设置的最小值,则删除“礼品”产品。问题是它产生了太多的生产错误,比如“你的脚本超过了时间限制”。 和“您的脚本超出了 cpu 限制。”
当前使用率为CPU: 5% | Memory: 8%
CPU: 5% | Memory: 8%
,并且每次我们添加一个新的 GWP 促销数组时,它都会以令人眼花缭乱的速度增长。
有没有更好的方法来构建这个逻辑,所以它需要更少的 memory 来处理整个订单 + GWP 验证?
这是“行项目”结构:
cart = Input.cart
PRO_TAG = 'professional-tag'
has_pro_tag = cart.customer && cart.customer.tags.include?(PRO_TAG)
GWP_SETTINGS = [
gwp_1 = {
"variant_id" => 98989898989898,
"discount_code" => "DISCOUNT_CODE_1",
"minimum_requirement" => Money.new(cents: 50 * 100),
"user_type" => "consumer"
},
gwp_2 = {
"variant_id" => 97979797979797,
"discount_code" => "DISCOUNT_CODE_1",
"minimum_requirement" => Money.new(cents: 50 * 100),
"user_type" => "consumer"
},
gwp_3 = {
"variant_id" => 96969696969696,
"discount_code" => "DISCOUNT_CODE_1",
"minimum_requirement" => Money.new(cents: 50 * 100),
"user_type" => "consumer"
}
]
def remove_GWP(cart, variant_id)
cart.line_items.each do |item|
next if item.variant.id != variant_id
index = cart.line_items.find_index(item)
cart.line_items.delete_at(index)
end
end
def ensure_only_one_GWP_is_added(cart, variant_id)
cart.line_items.each do |item|
next if item.variant.id != variant_id
item.instance_variable_set(:@quantity, 1)
end
end
GWP_SETTINGS.each do |gwp_item_settings|
customer_has_discount = cart.discount_code && cart.discount_code.code == gwp_item_settings["discount_code"]
customer_has_minimum = cart.subtotal_price >= gwp_item_settings["minimum_requirement"]
gwp_is_for_professional = gwp_item_settings["user_type"] == "professional-tag"
#UNLOGGED
if customer_has_discount && customer_has_minimum
ensure_only_one_GWP_is_added(cart, gwp_item_settings["variant_id"])
else
remove_GWP(cart, gwp_item_settings["variant_id"])
end
#PRO
if gwp_is_for_professional && has_pro_tag
if customer_has_discount && customer_has_minimum
ensure_only_one_GWP_is_added(cart, gwp_item_settings["variant_id"])
else
remove_GWP(cart, gwp_item_settings["variant_id"])
end
end
end
Output.cart = cart
您只有 3 个设置。 但是一个客户(一个订单)可能有 100 多个订单项。 您知道只有 1 个客户、1 个订单和 3 个 GWT 设置可供使用。
如果您只循环遍历行项目一次,您的业务逻辑会更智能。 然后,就您的算法而言,您有一个“与我一样快 go, go 到城镇”。 你不能比 go 更快。
对于诸如“此客户有 X 还是 Y?”之类的内容,您只需执行一次,而不是每个订单项 3 次!
当您检查每个行项目时,您可以针对可能影响该行项目的事情执行您的特殊逻辑。
基本上,这是基本的算法。 您正在无缘无故地重复做最多的工作,Shopify 正因此而呕吐。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.