2016-11-30 67 views
0

有沒有辦法在rails中產生可選的多對多關係?在軌道中可選多對多關係?

我有一個Client模型和ClientManager模型 - 我想要Client有0,1或許多client_managers。但我也想Clientmanger能夠有0,1或更多clients。這可能嗎?如何?

使用Rails 5.

更新了清晰/目的:我想clientmanagers,能夠管理多個客戶,甚至沒有。並且客戶端可以通過0,1或多個客戶端管理器進行管理

+0

爲什麼你不能只用'has_many:client_managers'? –

+0

它不清楚你想達到什麼目的。請包括您當前的模型。默認情況下,''has_many''關係可以有零個關聯對象。 – raj

+0

@AlexKojin如果我只是使用has_many:client_managers,客戶經理如何有多個客戶來照顧? – sneglefar

回答

1

如果是NxN關係,則應該創建屬於Client和ClientManager的另一個模型。讓我們把它叫做管理,例如:

rails g model Management client:references client_manager:references 

這會產生這樣的:在您的客戶端模型

class Management < ActiveRecord::Base 
    belongs_to :client 
    belongs_to :client_managers 
end 

,然後:

has_many :managements 
    has_many :client_managers :through => :managements 

,並在你的ClientManager:

has_many :managements 
    has_many :clients :through => :managements 

希望這可以幫助你弄清楚。祝你好運!

+0

謝謝!如果一個客戶沒有經理,那麼像這樣的多對多關係不會失敗嗎? – sneglefar

+0

不!如果你嘗試訪問一些client.client_managers,它將返回零,如果沒有。另外,@geoandri的答案也是可行的。我不熟悉rsrs,但這個鏈接給出了一個很好的例子:https://coderwall.com/p/i4c8mg/has_and_belongs_to_many-habtm-associations-in-rails-4 –

+0

想想我現在明白了。它甚至不會在中介/連接表中創建一行,因爲如果它沒有客戶管理器,就不需要關係 - 因此它不會拋出錯誤 - 沒有任何東西需要處理說話。 將此標記爲答案,因爲從其他帖子看來,這是執行多對多的最常見方式 - 並允許中間表中的其他行 – sneglefar

1

您還可以使用has_and_belongs_to_many關聯。

你的車型將是

class Client < ActiveRecord::Base 
    has_and_belongs_to_many :managers 
end 

class Manager< ActiveRecord::Base 
    has_and_belongs_to_many :clients 
end 
1

這是ClientClientManager數據模型之間的關係has_many through一個簡單許多一對多的關係。對於這一點,你需要設置在你的數據庫clientsclient_managers 3桌,projects

# models/client.rb 
class Client < ApplicationRecord 
    has_many :projects 
    has_many :client_managers, through: :projects 
end 

# models/project.rb 
# projects table schema should have- client_id:integer client_manager_id:integer 
class Project < ApplicationRecord 
    belongs_to :client 
    belongs_to :client_manager 
end  

# models/client_manager.rb 
class ClientManager < ApplicationRecord 
    has_many :projects 
    has_many :clients, through: :projects 
end 

訪問

Client.last.client_managers給人0,1或Client.last

ClientManager.last.clients給出0有關的許多client_managers, 1或許多與客戶有關的客戶ClientManager.last

more info here

+0

感謝您的答案和詳細的代碼示例。現在一切都說得通了! – sneglefar