循环内循环activerecord

时间:2015-02-15 20:26:42

标签: ruby-on-rails ruby activerecord

我有一个category_aliases表,其中aliase列(数组类型)和category_id列,指向categories表。

我有products表,其中有category列。

我有categories表。

我想遍历所有产品(很多),这些产品都有旧类别,并将这些产品映射到新类别。

所以我需要检查category_aliases.aliasealiase是否是旧类别数组)是否包含此product的{​​{1}},如果是,我想要将其从category表格映射到新类别。

我尝试的是:

categories

但我肯定遗漏了一些东西,因为即使我知道,它几乎总是匹配,它会一直将Product.all.each do |p| CategoryAlias.all.each do |ca| if ca.aliase.include? p.category p.update_column(:category, Category.find(ca.category_id).name) else p.update_column(:category, 'undefined') end end end 更新为p.category

2 个答案:

答案 0 :(得分:3)

您不需要遍历每个产品循环中的所有类别('each'),您只需要找到匹配的类别detect。 此外:如果您需要迭代许多产品,最好使用find_each

category_aliases = CategoryAlias.pluck(:name, :aliase)

Product.find_each do |product|
  category = category_aliases.detect { |ca| ca.aliase.include? product.category } 

  if category
    p.update_column(:category, cateory.name)
  else
    p.update_column(:category, 'undefined')
  end
end

答案 1 :(得分:1)

我在代码中看到了许多问题:

  1. 您在每次迭代时更新了category字段。如果'undefined'记录不包含类别,则会导致CategoryAlias更新。所有其他迭代都没有意义。
  2. 您需要在category更新后立即打破内部循环。
  3. 如果在整个category表中找不到别名类别,则需要在外部循环中将'undefined'更新为category_aliases