这是我的问题。
我有100,000多Products
,每人有5-6 Variants
。
它们都是通过CSV文件上传的,包含他们的信息(价格,尺寸,描述,图片网址等)。
问题是,CSV文件中有很多错误并且有定价。所有SM-XL尺寸应该相同,但不是。
我想通过改变所有SM-XL价格不同的变种,以及最高价格的变体。
例如,如果我有一个" SM"大小的产品@ 13.34美元,我有一个" MD"大小的产品@ 14.44美元,我有一个" LG"大小的产品@ 12.29美元......我希望它们全部改为14.44美元
我可以在不杀死应用程序内存的情况下获得最佳方法的建议吗?我想,我可以遍历每个Product's
variants
,但这会占用太多资源。我无法想象需要多长时间才能完成近1,000,000个对象并在必要时进行更新。
答案 0 :(得分:1)
您可以在一个SQL查询中执行此更新,如下所示:
UPDATE variants
SET price=subquery.max_price
FROM (
SELECT product_id AS pid, max(price) AS max_price FROM variants GROUP BY pid
) AS subquery
WHERE product_id=subquery.pid;
直接从控制台运行它或创建一个rake任务,它会为你运行它。
答案 1 :(得分:0)
我认为你不可避免地必须进行迭代,即使你不这样做,它也会使用大量内存。您可以使用Sidekiq或类似的东西将该过程作为后台作业运行吗?
无论哪种方式,您肯定希望尽可能保持查询的紧凑性。首先想到的是:
products = { 1 => { "price" => 14.44 }, 2 => { "price" => 14.44 } }
Product.update(products.keys, products.values)
也就是说,我认为通过执行原始SQL查询可以提高效率,因此您可能希望将此问题作为SQL问题而非Ruby on Rails。在Rails中执行SQL查询:
query = <<-SQL
SELECT *
FROM products
WHERE price != 14.44
SQL
这是一个可怕的问题,但你明白了。