2

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

无法将枚举器转换为数组

这是我的代码,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 和 Rails 3.2.6。

4

2 回答 2

4

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

不幸的是,我的环境并没有设置测试的魔力

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

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

于 2012-08-14T19:08:38.960 回答
4

collectionis anEnumerator显然无法转换为 a Array,这是replace预期的。

以下是来自 ruby​​docs 的评论:

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

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

如果没有给出块,则返回一个枚举器。

因此,您有两种选择:

  1. 如果您想要所有元素,请从 Enumerator 生成一个数组。
  2. 如果您只想要第一个匹配项,请提供一个块来确定匹配项。

希望这可以帮助。

(故事的寓意:总是阅读文档!)

于 2012-08-18T15:39:03.610 回答