无法将Enumerator转换为Array

时间:2012-08-09 04:50:55

标签: arrays ruby ruby-on-rails-3.2 mongoid enumerator

在处理一个应用程序时,我收到此错误:

  

无法将Enumerator转换为数组

以下是我的代码,mr_collection是MongoID查询。

mr_collection = self.where(query).map_reduce(map, reduce).finalize(finalize).out({:replace => 'mr_results'})
paginator = WillPaginate::Collection.new(page, limit, collection_count)

collection = mr_collection.find(
   :sort => sort,
   :limit => limit,
   :skip => skip
)
paginator.replace(collection)

获取mr_collection时,如果我检查结果mr_collection,则会给我:

[   
   {"_id"=>1.0, "value"=>{"s"=>4.2, "p"=>14.95, "pml"=>0.01993}}, 
   {"_id"=>2.0, "value"=>{"s"=>3.7, "p"=>12.9, "pml"=>0.0172}}, 
   {"_id"=>3.0, "value"=>{"s"=>4.2, "p"=>12.9, "pml"=>0.0172}}, 
   {"_id"=>4.0, "value"=>{"s"=>4.0, "p"=>11.95, "pml"=>0.01593}}, 
   {"_id"=>300.0, "value"=>{"s"=>0.0, "p"=>8.95, "pml"=>0.01193}}, 
]

获取collection时,如果我检查结果collection,则会给我:

#<Enumerator: []:find({:sort=>[["value.s", :desc], ["value.pml", :asc]], :limit=>10, :skip=>0})>

我在第paginator.replace(collection)行收到错误。我正在使用Ruby 1.9.3&amp; Rails 3.2.6。

2 个答案:

答案 0 :(得分:4)

我不知道mongoid从未使用过它。 但搜索引发了一个非常相似的问题 - Mongoid 3 - access map_reduce results

不幸的是,我的环境不会测试

的魔力
collection = mr_collection.send(:documents).sort(sort).limit(limit).skip(skip).to_a

你看过这个链接了吗?希望它能帮助您解决问题!

答案 1 :(得分:4)

collectionEnumerator,显然无法转换为Array,这是replace所期望的。

以下是rubydocs的评论:

  

可枚举#find(ifnone = nil){| e | ......}

     

将枚举中的每个条目传递给阻止。返回第一个块   不是假的。如果没有对象匹配,则调用ifnone并返回它   指定时的结果,否则返回nil。

     

如果没有给出阻止,则返回枚举器。

因此,您有两种选择:

  1. 如果您想要所有元素,请从枚举器到数组。
  2. 如果您只想要第一场比赛,请提供一个确定比赛内容的区块。
  3. 希望这有帮助。

    (故事的道德:总是阅读文档!)