Rails有很多关系

时间:2012-05-23 11:25:00

标签: ruby ruby-on-rails-3 mongodb mongoid

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

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')>

我该如何解决这个问题?

感谢。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分:1)

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

是Mongoid的bug。 杜兰已经解决了这个问题。

答案 2 :(得分: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和Courier的foreign_key origin_courier_id(或者对于Tracking和Courier的foreign_key destination_courier_id)可能发生冲突 不应该导致origin_ *和destination_ *之间的混淆。 我查看了元数据,该元数据仅适用于已设置的链接,元数据看起来还可以。 随着时间和优先事项的允许,进一步调查将是一个奇怪的问题。 其他人对Mongoid内部有一些见解或知识吗?