3

私のモデル:

class Entrant < ActiveRecord::Base
  has_many :events, :through => :event_maps
  has_many :event_maps, :foreign_key  => "entrant_id"
  accepts_nested_attributes_for :events, :reject_if => :all_blank
end

class Event < ActiveRecord::Base
  has_many :event_maps, :foreign_key => "event_id"
  has_many :entrants, :through => :event_maps
  accepts_nested_attributes_for :entrants, :reject_if => :all_blank
end

class EventMap < ActiveRecord::Base
  belongs_to :event, foreign_key: "event_id"  
  belongs_to :entrant, foreign_key: "entrant_id" 
end

私のマッピングは、コンソールで次のように実行できる限り、正しいです。

新しいイベントを作成し、新しい参加者を追加します。

@event = Event.new(name: 'my event');
@event.save
@event.entrants_attributes = [{name: 'Jack'}]
@event.save

新しい参加者を作成し、新しいイベントを追加します。

@entrant = Entrant.new(name: 'Peter')
@entrant.save
@entrant.events_attributes = [{name: 'Great concert'}]
@entrant.save

に、またはにどのようにマップPeterしますか? 意味my eventJackGreat concert

  1. 既存の参加者を既存のイベントに登録したいのですが、
  2. 新しい参加者を既存のイベントに追加する、またはその逆。

私が言ったように、多数 2 多数は両方の方法で機能するようですが、既存のオブジェクトのピボット テーブルにデータを追加することは、私にはあまり明確ではありません。助けてくれてありがとう。

編集:わかりました2を取得しました。

@event.entrants.new(name: "hello") #adds a new Entrant works
4

1 に答える 1

1

あなたはすることができます(j03wが提案したように)

   @event.entrants << @entrant

<< は二項左シフト演算子です。

二項左シフト演算子。左オペランドの値は、右オペランドで指定されたビット数だけ左に移動します。

また、配列が指定されたオブジェクトをこの配列の最後にプッシュするためにも使用されます。この式は配列自体を返すため、複数の追加を連鎖させることができます。

  $: [] << 'a'
  -> ['a']
于 2013-11-06T15:19:04.753 に答える