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 のドキュメントを 1 時間ほどグーグル検索して読んだ (そして再読した) 後、私は 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 に答える