在Ruby中将每个堆叠在每个上

时间:2014-06-18 13:47:54

标签: ruby-on-rails ruby loops

我正在迭代一些ActiveRecord模型,如下所示:

  

(例如,让我们说你不能直接得到所有的动物   流派。它迭代相关的问题,而不是关联的东西):

Animal.all.each do |animal|
    animal.families.each do |family|
        family.genres.each do |genre|
            genre.gsub("o","a")
            genre.save!
        end
    end
end

我认为这不是最好的方法。有没有解决方案让它变得更好?就像在.each模型上执行each的迭代器一样?

2 个答案:

答案 0 :(得分:3)

提高速度的一种方法是尝试首先完成所有查询。

animals = Animal.includes(families: genres)
animals.each do |animal|
  animal.families.each do |family|
    family.genres.each do |genre|
      genre.gsub("o","a")
      genre.save!
    end
  end
end

答案 1 :(得分:2)

如何使用flat_map

Animal.all.flat_map(&:families).flat_map(&:genres).each do |genre|
  genre.gsub("o","a")
  genre.save!
end

(这当然完全忽略了任何ActiveRecord相关的解决方案,更好“