如何在Rails中有效地进行批量更新?

时间:2016-03-26 05:08:38

标签: ruby-on-rails ruby xml

我正在与我们的仓库进行整合。我们收到包含所有SKU及其库存水平的XML消息。对于每个SKU,我需要更新我的rails应用程序中的库存级别。但是,每次我请求XML消息时,处理都非常慢,直到浏览器超时。我怀疑这是因为我必须按名称查找每个SKU并更新它的库存水平。 XML中应返回大约1000个SKU,这意味着每个SKU有2个查找,1个保存。

我有办法优化此集成的性能吗? 我对Rails相当新,但我觉得应该有一种更有效的方法。

示例XML:

<InventoryXML>
<Item> 
  <ItemID>ABC-12-2345</ItemID> 
  <ItemQty>14</ItemQty> 
  <Warehouses>
    <Warehouse> 
      <Name>Constitution</Name>
      <Quantity>9</Quantity> 
    </Warehouse>
    <Warehouse> 
      <Name>Vegas</Name>
      <Quantity>1</Quantity> 
    </Warehouse>
    <Warehouse> 
      <Name>Atlanta</Name>
      <Quantity>4</Quantity> 
    </Warehouse>
  </Warehouses> 
</Item>
</InventoryXML>

代码:

def process_inventory
    @doc.xpath('//Item').each do |item|
        name = item.xpath('//ItemID').text
        warehouses = item.xpath('//Warehouses')
        warehouses.xpath('Warehouse').each do |warehouse|
            if warehouse.xpath('Name').text == "Vegas"
                self.update_inventory_for_sku(2, name, warehouse.xpath('Quantity').text.to_i)
            elsif warehouse.xpath('Name').text == "PA"
                self.update_inventory_for_sku(1, name, warehouse.xpath('Quantity').text.to_i)
            end
        end
    end
    return "Succesfully updated SKU inventory"
end

def update_inventory_for_sku(vendor_id, name, quantity)
    sku = VendorSku.where({vendor_id: vendor_id, name: name}).first
    if sku
        sku.update_attributes(inventory_quantity: quantity)
    else
        self.hub_error_message += "\nSKU not found: " + name.to_s + "for vendor_id: " + vendor_id.to_s
    end
end

0 个答案:

没有答案