3

给定一个带有如下扩展的简单嵌入关系:

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我们正在使用的特定对象?

4

1 回答 1

7

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


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

  embeds_many :es do
    def m
      base
    end
  end

然后你可以这样说:

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

base记录,但文档仅存在于那里,因为它是使用定义的,attr_reader :base并且从attr_reader调用生成的文档并不是非常有用。base也与has_many协会合作。


我是怎么想出来的?关于扩展的文档@target在一个例子中提到:

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

@target不是我们要找的,@target是嵌入文档的数组本身,但我们想要那个数组在里面。对 for 的一些探索@target让我@base(以及相应的attr_reader :base电话)和一个快速的实验验证base了我正在寻找的东西。

于 2014-01-12T04:19:16.070 回答