2014-04-05 67 views
1

我想設置多個has_many:通過並行關係。這裏是我的2個標準和2個連接模型:Rails has_many:through - >如何設置關聯以從多個連接模型中拉取?

User.rb

has_many :ownerships, dependent: :destroy 
has_many :devices, through: :ownerships 

has_many :bookings, dependent: :destroy 
has_many :devices, through: :bookings 

Ownership.rb

belongs_to :user, touch: true, counter_cache: :devices_count 
belongs_to :device, touch: true 

Booking.rb

belongs_to :user, touch: true, counter_cache: :bookings_count 
belongs_to :device, touch: true, counter_cache: :bookings_count 

Device.rb

has_many :ownerships, dependent: :destroy 
has_many :users, through: :ownerships 

has_many :bookings, dependent: :destroy 
has_many :users, through: :bookings 

預期該電流設置不工作,似乎是加盟模式之間的串擾。我希望連接模型能夠獨立並行(即用戶可以擁有關係 - 所有權 - 設備無法預訂)。我不在這裏尋找嵌套的has_many:through關係。

當我更改設備的用戶所有權似乎改變了預訂的數量,反之亦然......我應該如何正確設置它的任何想法?

回答

1

我想你已經得到了第一個錯誤是你同名調用兩個協會(users/devices

幫助任何進一步的受訪者中,真正的問題是 - >how do you set up an association to pull from multiple join models?


快速修復

的Rails協會按其類爲主命名,但BEC衝突的使用,你應該避免設置它們兩次。這就是你看到當前問題的原因。一個簡單的分辨率會用不同的名字來調用關聯:

User.rb 
has_many :ownerships, dependent: :destroy 
has_many :owner_devices, through: :ownerships, class_name: "Device", foreign_key: "ownership_id" 

has_many :bookings, dependent: :destroy 
has_many :booking_devices, through: :ownerships, class_name: "Device", foreign_key: "booking_id" 

我仍然在尋找的信息,你怎麼可以設置關聯使用兩個模型

+0

感謝您的回答,我認爲它是在正確的軌道上。你確定foreign_keys正確嗎?他們不應該分別爲ownership_id和booking_id嗎? –

+0

沒問題 - 不,我不確定他們是否正確:)我會看看! –

+0

這只是一個快速修復;至於爲一個關聯提供多組數據 - 我需要了解這個 –

1

這似乎是一個可行的解決方案如下豐富佩克建議:

User.rb

has_many :ownerships, dependent: :destroy 
has_many :device_ownerships, through: :ownerships, class_name: "Device", foreign_key: "device_id", source: :device 

has_many :bookings, dependent: :destroy 
has_many :device_bookings, through: :bookings, class_name: "Device", foreign_key: "device_id", source: :device 

Booking.rb(加入模型)

belongs_to :user, touch: true, counter_cache: :bookings_count 
belongs_to :device, touch: true, counter_cache: :bookings_count 

Ownership.rb(加入模型)

belongs_to :user, touch: true, counter_cache: :devices_count 
belongs_to :device, touch: true, counter_cache: :users_count 

設備。RB

has_many :ownerships, dependent: :destroy 
has_many :user_ownerships, through: :ownerships, class_name: "User", foreign_key: "user_id", source: :user 

has_many :bookings, dependent: :destroy 
has_many :user_bookings, through: :bookings, class_name: "User", foreign_key: "user_id", source: :user 

說實話,我在爲什麼foreign_key的需要(?)被設置爲他們有點糊塗了,所以我必須做更多的閱讀了。否則它看起來是功能性的,我沒有看到這些連接模型之間的串擾了。

+0

好的工作 - 'foriegn_key'基本上是一個變量,用於定義正確的列名稱,如果您使用的是非常規關聯。最好將關聯視爲方法,這些方法具有從名稱派生的自動化選項。如果你使用的是非標準名稱,你的論點需要修改爲sui t :) –

+0

順便說一句,如果它有幫助,你可能想要提高我的答案;) –

相關問題