遍历惰性加载数组

时间:2018-07-26 05:15:34

标签: ruby-on-rails ruby

我正在尝试构建一个哈希数组,然后进行迭代。 如果我使用下面的代码

    @elements = [{:profile_id=>"123"}, {:profile_id=>"456"}]
    @categories = Array.new
    @elements.each do |element|
     category = Category.find_by_profile_id(element[:profile_id])
     @categories.push(category)
    end

它将找到最后一个对象,并将其添加到数组中。但是,我想获取所有具有该ID的记录。

我一直在尝试下面的代码

    @elements = [{:profile_id=>"123"}, {:profile_id=>"456"}]
    @categories = Array.new
    @elements.each do |element|
     category = RootCategory.where(profile_id: element[:profile_id])
     @categories.push(category)
    end


 #response
 [#<ActiveRecord::Relation [#<Category id: "123", ...">, #<Category id: "123", ..."> #<ActiveRecord::Relation [#<Category id: "456", ...">, #<Category id: "456", ...">]>] 

我无法遍历返回的数组。如果我尝试

@categories.each do |t|
   puts t.name
end

#Prints
#Category
#Category

1 个答案:

答案 0 :(得分:5)

这主要是因为您滥用each进行map ping。 ActiveRecord::Base#where返回一个Relation对象(不失一般性,此处可以将其视为数组)。您需要的是Enumerable#flat_map

elements = [{:profile_id=>"123"}, {:profile_id=>"456"}]
@categories = 
  elements.flat_map do |element|
    RootCategory.where(profile_id: element[:profile_id])
  end

或更妙的是,避免使用多个查询,因为where愉快地接受了一个数组:

@categories = 
  RootCategory.where(profile_id: elements.map { |e| e[:profile_id] })

后者基本上正在执行:

RootCategory.where(profile_id: [123, 456])

检索所有指定配置文件的类别。