2015-04-17 75 views
3

我發送序列化數據到需要訪問可能嵌入或不嵌入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 

回答

1

好吧,經過幾個小時的調試,我發現它實際上是Mongoid中的一個錯誤。

關係不是一個數組,而是數組周圍的代理,它將大多數方法委託給數組。

由於public_send也被授權但不是send__send__,行爲是不一樣的。

欲瞭解更多信息,請參閱我的pull request和相關的提交。

+0

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

+0

@JordanLapp存儲庫已移動,我更新了鏈接。 無論如何,此後合併請求已被接受 – Geoffroy