2012-05-23 254 views
0

我有他們之間的兩個關係Rails有很多關係

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,它複製到o​​rigin_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')> 

我怎樣才能解決這個價值?

謝謝。

+0

很奇怪。您是否嘗試過Courier.last.origins << Tracking.new和Courier.last.destinations << Tracking.new? –

+0

@soundar它仍然是一樣的情況......不知道爲什麼 – Dante

回答

1

(您混合新的Hash notaion(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 
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和DO第二通過馬克西姆·加西亞用inverse_of的建議。

對於的has_many/belongs_to的,這種關係只在一側進行跟蹤,即使關係是雙方定義, 所以像活動記錄,Mongoid供您選擇,在這種情況下,有效地把單個鏈接到Tracking實例中,而不是在Courier實例中增長鏈接數組。

但是,對於Tracking_Courier(或Tracking_Courier的foreign_key_destination_courier_id)的foreign_key origin_courier_id可能發生的衝突 不應導致origin_ *和destination_ *之間的混淆。 我查看了元數據,它僅適用於設置的鏈接,元數據看起來不錯。 這當然是一個奇怪的問題,隨着時間和優先權的允許進一步調查將會很有趣。 其他人對Mongoid內部有一些見解或知識?