0

Rails 4 の 2 つの埋め込みドキュメント間に Mongoid NN 参照関連付けを作成しようとしていますが、これがどのように行われるかを理解するのは難しいと感じています。

以下の関連モデルに HABTM 関連付けを追加することから始めました (TrackおよびOption) が、もちろん、両方が埋め込まれているため、これは許可されていないというエラーが表示されます。

class Brief
  embeds_many :tracks
end

class Track
  embedded_in :brief
  has_and_belongs_to_many :options
end

class Category
  embeds_many :options
end

class Option
  field :name, type: String
  field :track_ids, type: Array
  embedded_in :category
  has_and_belongs_to_many :tracks

  def parent
    self.category
  end

  def tracks
    self.parent.tracks.where(:option_id => self.id)
  end
end

これがなぜなのかを完全に理解しており、親ドキュメントを参照する必要があることはわかっていますが、ここで問題が発生します。

コンソール配列を介してトラック ID を追加しようとしましたtrack_idsが、以前と同じエラーが発生します。

「問題: トラックが埋め込まれているため、リレーショナル アソシエーションを介してオプション ドキュメントから a(n) トラック ドキュメントを参照することは許可されていません。概要: オプションから a(n) トラックに適切にアクセスするには、参照はルートを通過する必要があります。単純なケースでは、Mongoid がルートの追加の外部キーを保存する必要があります。より複雑なケースでは、Track が複数レベルの深さであり、階層の上位の親ごとにキーを保存する必要があります。」

追加の外部キーを保存したいのですが、どのように、どの形式で保存するのかわかりません。誰かが私を正しい方向に向けることができれば、私はそれを感謝します.

4

1 に答える 1

0

エラーが発生する理由は、以下のロジックによるものです。多対多の関係を表す必要がある場合は、ドキュメント モデルを使用して状態を保存しないでください。リレーショナルを使用する

===

関連付け/参照テーブル/オブジェクトがなければ、多対多の関係を表すことはできません。参照テーブルがない場合、すべての関係 (およびそれらの関係) が変更される (場合によっては再保存される) ため、いずれかの端を更新すると、無限の更新が発生する可能性があります。

例えば、

トラック 1、=> オプション 1、2、3

オプション 1、=> トラック 1、2、3

トラック 2、=> オプション 1、2

オプション 2、=> トラック 1、2

トラック 3、=> オプション 1、3、4

オプション 3、=> トラック 1、3、4

それでは、トラック 1 を編集してみましょう。

1) トラック 1 を更新する

2) オプション 1、2、3 で更新を発生させる

3) オプション 1 により、トラック 1 の re=update が発生しました (1,2,3 の無限の繰り返し)

4) オプション 2 により、トラック 1、2 が更新されます (再び無限に繰り返されます)。

5) など...

于 2015-06-22T14:56:14.537 に答える