0

我有两个模型,它们之间有两种关系

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

(您将新的哈希表示法(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 回答
1

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

It is bug of Mongoid. Durran has fixed it.

于 2012-06-01T02:52:58.700 回答
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 实例中增加一系列链接。

但是对于 Tracking and Courier 的 foreign_key origin_courier_id(或对于 Tracking and Courier 的 foreign_key destination_courier_id)可能发生的冲突不应导致 origin_* 和 destination_* 之间的混淆。我查看了元数据,它仅适用于已设置的链接,元数据看起来还不错。这当然是一个奇怪的问题,如果时间和优先级允许,进一步调查会很有趣。其他人对 Mongoid 内部结构有一些见解或知识吗?

于 2012-05-31T15:54:20.410 回答