Mongoid嵌入式关系扩展中的父对象

时间:2014-01-12 04:19:16

标签: mongoid mongoid3 embedded-documents

给出与这样的扩展的简单嵌入关系:

class D
  include Mongoid::Document
  embeds_many :es do
    def m
      #...
    end
  end
end

class E
  include Mongoid::Document
  embedded_in :d
end

你可以这样说:

d = D.find(id)
d.es.m

在扩展程序的m方法中,如何访问我们正在使用的特定d

1 个答案:

答案 0 :(得分:7)

我自己回答这个问题以供将来参考。如果有人有这样做的官方和记录方式,请告诉我。


经过一个小时左右的谷歌搜索和阅读(并重新阅读)Mongoid文档后,我转向了Mongoid源代码。一些搜索和猜测引导我@base及其访问方法base

  embeds_many :es do
    def m
      base
    end
  end

然后你可以这样说:

d = D.find(id)
d.es.m.id == id # true

basedocumented,但文档仅在那里,因为它是使用attr_reader :base定义的,而attr_reader调用生成的文档并不是非常有用。 base也适用于has_many个关联。


我是怎么想出来的? documentation on extensions在一个示例中提及@target

embeds_many :addresses do
  #...
  def chinese
    @target.select { |address| address.country == "China"}
  end
end

@target不是我们正在寻找的东西,@target是嵌入式文档本身的数组,但我们想要该数组所在的内容。对@target进行了一些关注,让我@base(以及相应的attr_reader :base来电),并通过快速实验验证base是我正在寻找的。