Mongoid嵌入式收集响应:查找

Mongoid嵌入式收集响应:查找

问题描述:

我发送序列化数据到需要访问可能嵌入或不嵌入Mongoid文档的类。Mongoid嵌入式收集响应:查找

在嵌入式文档的情况下,我接受可变数量的参数,我reduce获得嵌入式文档。

的代码非常简单:

def perform(object, *arguments) 
    @opts = arguments.extract_options! 
    @object = arguments.reduce(object){|object, args| object.public_send(*args)} 
    # [...] 

我用public_send,因为据我所知,我只需要调用公共方法。

但是,当我尝试访问嵌入式文档时,我得到了一些非常奇怪的结果,其中@object是一个枚举器。

一些调试后,这是我发现,对于任何根文件object和嵌入式收集items,我有:

object.items.public_send(:find) 
# => #<Enumerator: ...> 
object.items.send(:find) # or __send__ 
# => nil 

调用的方法是不一样的,在所有的时候我打电话public_sendsend

  • 这怎么可能?
  • 这是正常的吗?这是一个错误?

public_send似乎调用的ArrayEnumerable),但send(或__send__)的find方法调用Mongoid


编辑的find方法:简单reproductible情况:

require 'mongoid' 

class User 
    include Mongoid::Document 

    field :name, type: String 

    embeds_many :groups 
end 

class Group 
    include Mongoid::Document 

    field :name, type: String 

    embedded_in :user 
end 

Mongoid.load_configuration({ 
    sessions: { 
    default: { 
     database: 'send_find', 
     hosts: [ 
     'localhost:27017' 
     ] 
    } 
    } 
}) 

user = User.create(name: 'john') 
user.groups.create(name: 'g1') 
user.groups.create(name: 'g2') 

puts "public_send :find" 
puts user.groups.public_send(:find).inspect 
# => #<Enumerator: [#<Group _id: 5530dea57735334b69010000, name: "g1">, #<Group _id: 5530dea57735334b69020000, name: "g2">]:find> 
puts "send :find" 
puts user.groups.send(:find).inspect 
# => nil 
puts "__send__ :find" 
puts user.groups.__send__(:find).inspect 
# => nil 

好吧,经过几个小时的调试,我发现它实际上是Mongoid中的一个错误。

关系不是一个数组,而是数组周围的代理,它将大多数方法委托给数组。

由于public_send也被授权但不是send__send__,行为是不一样的。

欲了解更多信息,请参阅我的pull request和相关的提交。

+0

链接已死亡。任何更新? –

+0

@JordanLapp存储库已移动,我更新了链接。 无论如何,此后合并请求已被接受 – Geoffroy