有沒有辦法在rails中產生可選的多對多關係?在軌道中可選多對多關係?
我有一個Client
模型和ClientManager
模型 - 我想要Client
有0,1或許多client_managers
。但我也想Clientmanger
能夠有0,1或更多clients
。這可能嗎?如何?
使用Rails 5.
更新了清晰/目的:我想clientmanagers,能夠管理多個客戶,甚至沒有。並且客戶端可以通過0,1或多個客戶端管理器進行管理
有沒有辦法在rails中產生可選的多對多關係?在軌道中可選多對多關係?
我有一個Client
模型和ClientManager
模型 - 我想要Client
有0,1或許多client_managers
。但我也想Clientmanger
能夠有0,1或更多clients
。這可能嗎?如何?
使用Rails 5.
更新了清晰/目的:我想clientmanagers,能夠管理多個客戶,甚至沒有。並且客戶端可以通過0,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
希望這可以幫助你弄清楚。祝你好運!
謝謝!如果一個客戶沒有經理,那麼像這樣的多對多關係不會失敗嗎? – sneglefar
不!如果你嘗試訪問一些client.client_managers,它將返回零,如果沒有。另外,@geoandri的答案也是可行的。我不熟悉rsrs,但這個鏈接給出了一個很好的例子:https://coderwall.com/p/i4c8mg/has_and_belongs_to_many-habtm-associations-in-rails-4 –
想想我現在明白了。它甚至不會在中介/連接表中創建一行,因爲如果它沒有客戶管理器,就不需要關係 - 因此它不會拋出錯誤 - 沒有任何東西需要處理說話。 將此標記爲答案,因爲從其他帖子看來,這是執行多對多的最常見方式 - 並允許中間表中的其他行 – sneglefar
您還可以使用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
這是Client
和ClientManager
數據模型之間的關係has_many through
一個簡單許多一對多的關係。對於這一點,你需要設置在你的數據庫clients
,client_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
感謝您的答案和詳細的代碼示例。現在一切都說得通了! – sneglefar
爲什麼你不能只用'has_many:client_managers'? –
它不清楚你想達到什麼目的。請包括您當前的模型。默認情況下,''has_many''關係可以有零個關聯對象。 – raj
@AlexKojin如果我只是使用has_many:client_managers,客戶經理如何有多個客戶來照顧? – sneglefar