gpt4 book ai didi

ruby - Mongoid 嵌入式集合响应 :find

转载 作者:数据小太阳 更新时间:2023-10-29 08:08:13 25 4
gpt4 key购买 nike

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

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

代码非常简单:

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

我使用了 public_send 因为据我所知我只需要调用公共(public)方法。

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

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

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

调用public_sendsend 调用的方法完全不一样!

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

public_send 似乎调用了Array (Enumerable) 的find 方法,但是send(或__send__)调用Mongoid的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的一个bug。

关系不是数组,而是围绕数组的代理,它将大多数方法委托(delegate)给数组。

由于 public_send 也被委托(delegate)但不是 send__send__,行为是不一样的。

有关详细信息,请参阅我的 pull request以及相关的提交。

关于ruby - Mongoid 嵌入式集合响应 :find,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29695736/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com