1

この質問に非常に似ていますが、まったく同じではありません。

私はミュージシャンと楽器のモデルを持っています:

# 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

可能な楽器の静的リストがあり、ユーザーはそのリストから、新しいビューと編集ビューの選択フォームで選択します。これらすべての楽器には既存のレコードがあると仮定します。ミュージシャンと楽器の間に新しい関連付けを追加するにはどうすればよいですか?

ありがとう!

4

1 に答える 1

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

一意性を確保するために、結合テーブルに一意制約を追加できます。

于 2012-11-12T07:32:33.117 に答える