我有一个category_aliases
表,其中aliase
列(数组类型)和category_id
列,指向categories
表。
我有products
表,其中有category
列。
我有categories
表。
我想遍历所有产品(很多),这些产品都有旧类别,并将这些产品映射到新类别。
所以我需要检查category_aliases.aliase
(aliase
是否是旧类别数组)是否包含此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
。
答案 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)
我在代码中看到了许多问题:
category
字段。如果'undefined'
记录不包含类别,则会导致CategoryAlias
更新。所有其他迭代都没有意义。category
更新后立即打破内部循环。category
表中找不到别名类别,则需要在外部循环中将'undefined'
更新为category_aliases
。