2012-08-09 80 views
2

虽然在一个应用程序我得到这个工作的错误:不能转换成枚举器阵列

can't convert Enumerator into Array

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

+0

刚刚更新了问题 – 2012-08-09 05:04:45

回答

4

collection是一个Enumerator显然不能转换为Array,这是replace预计。

下面是从rubydocs评论:

Enumerable#find(ifnone = nil) { |e| ... }

Passes each entry in enum to block. Returns the first for which block is not false. If no object matches, calls ifnone and returns its result when it is specified, or returns nil otherwise.

If no block is given, an enumerator is returned instead.

因此,你有两个选择:

  1. 如果你想要的所有元素,产量从枚举到数组。
  2. 如果您只想要第一个匹配项,请提供一个确定匹配项的块。

希望这会有所帮助。

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

4

我不知道mongoid从来没有使用它。 但搜索带来了一个脱颖而出非常类似的问题 - Mongoid 3 - access map_reduce results

不幸的是我的environent未设置来测试你有没有看一下这个链接的

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

的魔力?希望它能帮助你解决问题!