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_send
或send
!
- 这怎么可能?
- 这是正常的吗?这是一个错误?
public_send
似乎调用的Array
(Enumerable
),但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和相关的提交。
链接已死亡。任何更新? –
@JordanLapp存储库已移动,我更新了链接。 无论如何,此后合并请求已被接受 – Geoffroy