0

多くの Bar を埋め込んだ Foo というモンゴイド モデルがあるとします。

class Foo
    ...
    embeds_many :bar
    ...
end

class Bar
    ...
    embedded_in :foo
    ...
end

バーが自分自身にリンクする関係を作成したいと思います。この関係は常に、同じ Foo ドキュメントに埋め込まれている 2 つのドキュメントに関係します。関係を呼び出すときに nil を返さずにこれを行うことはできないようです。私が試してみました

belongs_to :discovered_by, :class_name => 'Bar'

そしてまた

has_one :discovered_by, :class_name => 'Bar'

Discovery_by id が Bar ドキュメントに設定され、他の Bar ドキュメントを指している間、次のことをしようとすると nil になります (最初の Foo の最初の Bar にdiscovered_by_id が設定されていると仮定します)。

Foo.first.bars.first.discovered_by

ドキュメントにIDが設定されているにもかかわらず、これは常にnilを返します。なぜこれが起こっているのかについて何か考えはありますか?助けてくれてありがとう。

4

1 に答える 1

1

両方が同じドキュメントに埋め込まれている場合でも、埋め込みモデルへの参照を持つことはできません。関係を正しく構成した場合

belongs_to :discovered_by, :class_name => 'Bar', inverse_of: :discovered
has_one :discovered, :class_name => 'Bar', inverse_of: :discovered_by

Mongoid はMongoid::Errors::MixedRelations例外を発生させます。これらのオブジェクトを埋め込むことが依然として最良の選択であるかどうかを再考することもできます。回避策は、ID のみを保存し、親オブジェクトを照会することです。

class Bar
    include Mongoid::Document
    embedded_in :foo
    field :discovered_by_id, type: Moped::BSON::ObjectId

    def discovered_by
      foo.bars.find(discovered_by_id) if discovered_by_id
    end

    def discovered_by=(bar)
      self.discovered_by_id = bar.id
    end
end
于 2013-03-29T16:49:04.957 に答える