0

私はそれらの間に2つの関係がある2つのモデルを持っています

class Tracking
  include Mongoid::Document

  belongs_to :origin_courier, :class_name => "Courier", foreign_key: "origin_courier_id"
  belongs_to :destination_courier, :class_name => "Courier", foreign_key: "destination_courier_id"

end

class Courier
  include Mongoid::Document

  has_many :origins, class_name: 'Tracking', foreign_key: "origin_courier_id"
  has_many :destinations, class_name: 'Tracking', foreign_key: "destination_courier_id"
end

新しく作成されたトラッキングのorigin_courierに宅配便を割り当てると、正常に実行されます。

1.9.3p194 :015 > t = Tracking.new
 => #<Tracking _id: 4fbcc2772cfb397930000003, _type: nil, created_at: nil, updated_at: nil, origin_courier_id: nil, destination_courier_id: nil> 
1.9.3p194 :016 > t.origin_courier = Courier.last
 => #<Courier _id: 4fbcbb072cfb397657000004, _type: nil, created_at: 2012-05-23 10:25:11 UTC, updated_at: 2012-05-23 10:25:11 UTC> 
1.9.3p194 :017 > t
 => #<Tracking _id: 4fbcc2772cfb397930000003, _type: nil, created_at: nil, updated_at: nil, origin_courier_id: BSON::ObjectId('4fbcbb072cfb397657000004'), destination_courier_id: nil> 
1.9.3p194 :018 > t.save
 => true 
1.9.3p194 :019 > t
 => #<Tracking _id: 4fbcc2772cfb397930000003, _type: nil, created_at: 2012-05-23 10:57:14 UTC, updated_at: 2012-05-23 10:57:14 UTC, origin_courier_id: BSON::ObjectId('4fbcbb072cfb397657000004'), destination_courier_id: nil>

しかし、新しく作成されたトラッキングのdestination_courierに宅配便を割り当てると、origin_courierの値が複製されます。

1.9.3p194 :020 > t2 = Tracking.new
 => #<Tracking _id: 4fbcc3002cfb397930000004, _type: nil, created_at: nil, updated_at: nil, origin_courier_id: nil, destination_courier_id: nil> 
1.9.3p194 :021 > t2.destination_courier = Courier.last
 => #<Courier _id: 4fbcbb072cfb397657000004, _type: nil, created_at: 2012-05-23 10:25:11 UTC, updated_at: 2012-05-23 10:25:11 UTC> 
1.9.3p194 :022 > t2.save
 => true 
1.9.3p194 :023 > t2
 => #<Tracking _id: 4fbcc3002cfb397930000004, _type: nil, created_at: 2012-05-23 11:00:39 UTC, updated_at: 2012-05-23 11:00:39 UTC, origin_courier_id: BSON::ObjectId('4fbcbb072cfb397657000004'), destination_courier_id: BSON::ObjectId('4fbcbb072cfb397657000004')>

どうすればこれを解決できますか?

ありがとう。

4

3 に答える 3

1

https://github.com/mongoid/mongoid/issues/2038

Mongoidのバグです。デュランはそれを修正しました。

于 2012-06-01T02:52:58.700 に答える
1

(新しいハッシュ表記 (1.9.3) と古いものを で混在させましたTracking)

inverse_of代わりに試しましたforeign_keyか?

class Tracking
  include Mongoid::Document

  belongs_to :origin_courier, class_name: "Courier", inverse_of: :origins
  belongs_to :destination_courier, class_name: "Courier", inverse_of: :destinations

end

class Courier
  include Mongoid::Document

  has_many :origins, class_name: 'Tracking', inverse_of: :origin_courier
  has_many :destinations, class_name: 'Tracking', inverse_of: :destination_courier
end
于 2012-05-30T12:27:48.150 に答える
0

「非常に奇妙な」エコー

次の変更も機能しますが、根本的な問題に光を当てる可能性があるという理由だけで提示します。

class Courier
  include Mongoid::Document

  has_many :origin_trackings, class_name: "Tracking", foreign_key: :origin_tracking_id
  has_many :destination_trackings, class_name: "Tracking", foreign_key: :destination_tracking_id
end

ただし、foreign_keyを使用しないことをお勧めします。Maxime Garcia による inverse_of の使用を推奨しています。

has_many /belongs_toの場合、リレーションシップが両側で定義されている場合でも、リレーションシップは片側でのみ追跡する必要があります. Active Record と同様に、Mongoid が選択します. この場合、単一のリンクを Tracking インスタンスに効率的に配置します. Courier インスタンスでリンクの配列を増やすのではなく、

しかし、トラッキングとクーリエのforeign_key origin_courier_id (またはトラッキングとクーリエのforeign_key destination_courier_id) の衝突の可能性は、origin_*とdestination_*の間の混乱を招くべきではありません。設定されたリンクでのみ利用可能なメタデータを確認しましたが、メタデータは問題ないようです。時間と優先順位が許す限り、これは確かに奇妙な問題であり、さらに調査することは興味深いでしょう。他の誰かが Mongoid 内部についての洞察や知識を持っていますか?

于 2012-05-31T15:54:20.410 に答える