1

非常相似this的問題,但不完全相同。has_many:通過與現有對象

我有音樂家和儀器型號:

# musician.rb 
class Musician < ActiveRecord::Base 
    attr_accessible :instrument_attributes 
    has_many :instrument_choices 
    has_many :instruments, through: instrument_choices 
    accepts_nested_attributes_for :instruments # with some other stuff 
end 

# instrument.rb 
class Instrument < ActiveRecord::Base 
    has_many :inverse_instrument_choices, class_name: "InstrumentChoice" 
    has_many :musicians, through: :inverse_instrument_choices 
    validates_uniqueness_of :name 

# instrument_choice.rb 
class InstrumentChoice < ActiveRecord::Base 
    belongs_to :musician 
    belongs_to :instrument 
    validates_uniqueness_of :musician_id, scope: :instrument_id 

我有可能儀器的靜態列表,用戶從該列表中選擇的形式在新的選擇和編輯的意見。假設所有這些儀器都有現有記錄。我如何處理添加音樂家和樂器之間的新關聯?

謝謝!

回答

2

您可以創建InstrumentChoice或者通過關聯或直接創建記錄:

musician.instrument_choices.create(instrument: an_instrument) 
# or 
InstrumentChoice.create(musician: a_musician, instrument: an_instrument) 

因爲你沒有真正存儲InstrumentChoice任何額外的信息,你可以使用一個簡單連接表是不需要自己的型號:

class Musician < ActiveRecord::Base 
    has_and_belongs_to_many :instruments 
end 

class Instrument < ActiveRecord::Base 
    has_and_belongs_to_many :musicians 
end 

musician.instruments << an_instrument 

爲確保唯一性,您可以爲連接表添加唯一約束。

+0

感謝您的快速回復,菲利普。問題是我在'create'動作中做了'@musician = Musician.new(params ['musicians'])',所以我認爲它會自動爲我創建關聯,這不是我想要的,因爲將嘗試創建新的樂器記錄。我應該只是逐塊加載參數,然後按照你的說法建立關聯? – Eric

+0

因此,當您想存儲樂器時音樂家是不存在的?另外,因爲我看到'params''musicians'',你是否試圖同時創建多個音樂家? – fphilipe

+0

抱歉,意味着音樂家。我需要考慮兩種情況:創建音樂家簡介並添加樂器,編輯音樂家簡介,以便我可以(或不可以)添加/刪除樂器關聯。 – Eric