2012-08-09 81 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 

的魔力?希望它能幫助你解決問題!