寻找属性不一样的孩子

时间:2018-02-21 05:28:42

标签: sql ruby-on-rails postgresql

这是我的问题。
我有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个对象并在必要时进行更新。

2 个答案:

答案 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

这是一个可怕的问题,但你明白了。