Mongoid嵌入式集合对:find的响应

杰弗罗伊

我正在将序列化数据发送到需要访问可能嵌入或未嵌入的Mongoid文档的类。

对于嵌入式文档,我要接受可变数量的参数,reduce以获取嵌入式文档。

代码很简单:

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

我使用了public_sendAFAIK,因为我只需要调用公共方法。

但是,当我尝试访问嵌入式文档时,@object在枚举器的位置出现了一些非常奇怪的结果

经过一些调试之后,我发现对于任何根文档object和嵌入式集合items,我都有:

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

当我调用public_sendor时,调用的方法根本不一样send

  • 怎么可能呢?
  • 正常吗 那是个错误吗?

public_send似乎调用find方法,但是(或)调用Mongoid方法ArrayEnumerablesend__send__find


编辑:简单的可重复的情况:

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__,其行为是不相同的。

有关更多信息,请参见我的拉取请求和关联的提交。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章