繁体   English   中英

如何提高 Shopify 脚本性能的 Ruby 结构

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM