2

1 つのアプリケーションで作業しているときに、次のエラーが発生します。

列挙子を配列に変換できません

これが私のコード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

collectionEnumerator明らかに に変換できないであり、期待さArrayれるものです。replace

rubydocs からのコメントは次のとおりです。

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

列挙型の各エントリをブロックに渡します。block が false でない最初のものを返します。一致するオブジェクトがない場合は、ifnone を呼び出し、指定されている場合はその結果を返し、それ以外の場合は nil を返します。

ブロックが指定されていない場合は、代わりに列挙子が返されます。

したがって、次の 2 つのオプションがあります。

  1. すべての要素が必要な場合は、列挙子から配列に譲ります。
  2. 最初の一致のみが必要な場合は、一致が何であるかを決定するブロックを指定します。

お役に立てれば。

(この話の教訓: 常にドキュメントを読んでください!)

于 2012-08-18T15:39:03.610 に答える
4

モンゴイドが一度も使用したことがないことについてはわかりません。しかし、検索により、非常によく似た質問が提示されました -Mongoid 3-map_reduceの結果にアクセスします

残念ながら、私の環境は魔法をテストするように設定されていません

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

このリンクをご覧になりましたか?問題の解決に役立つことを願っています。

于 2012-08-14T19:08:38.960 に答える