我正在尝试构建一个哈希数组,然后进行迭代。 如果我使用下面的代码
@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
答案 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])
检索所有指定配置文件的类别。