【问题标题】:can't convert Enumerator into Array无法将枚举器转换为数组
【发布时间】:2012-08-09 04:50:55
【问题描述】:

在处理一个应用程序时出现此错误:

无法将 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 和 Rails 3.2.6。

【问题讨论】:

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


    【解决方案1】:

    collection 是一个 Enumerator,显然不能转换为 Array,而这正是 replace 所期望的。

    以下是 ruby​​docs 中的 cmets:

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

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

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

    因此你有两个选择:

    1. 如果您想要所有元素,请从枚举器中让出到数组。
    2. 如果您只需要第一个匹配项,请提供一个块来确定匹配项。

    希望这会有所帮助。

    (故事的寓意:始终阅读文档!)

    【讨论】:

      【解决方案2】:

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

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

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

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

      【讨论】:

        猜你喜欢
        • 2013-01-17
        • 1970-01-01
        • 2019-03-04
        • 1970-01-01
        • 2013-06-26
        • 1970-01-01
        • 1970-01-01
        • 2021-03-10
        • 1970-01-01
        相关资源
        最近更新 更多