简体   繁体   中英

Using join model with nested form (has_many :through relationship)

I have a Form_for for a Show model. I would like to use a fields_for within the form_for to add bands. The thing is I don't want the fields tied to the bands when using the form to update records. If the name of the band changes I would like to update the performance with the new band.

Shows are joined with Bands through Performances

class Show < ActiveRecord::Base
  has_many :performances
  has_many :bands, through: :performances
  accepts_nested_attributes_for :bands
end

class Band < ActiveRecord::Base
  attr_accessible :name, :website, :country, :state
  has_many :performances
  has_many :shows, through: :performances

  validates :name, presence: true, uniqueness: true
end

class Performance < ActiveRecord::Base
  attr_accessible :show, :band
  belongs_to :show
  belongs_to :band
end

Here is my form. (simplified)

<%= form_for @show do |f| %>
     #fields
    <%= f.fields_for :bands do |b| %>
      <%= b.text_field :name %>      
    <% end %>
<%end>

The problem is if this is used to change a bands name, it changes the bands name (crazy right?). I don't want it to update the Band record-- I want it to do a Band.find_or_create and update the performance record with the new band's id. This way users can replace a band in a show by removing the name and adding in another band name.

The rendered html should include the performance id not the band id (I think)

Something like:

<input id="show_performance_attributes_1_id" name="show[performance_attributes][1][id]" type="hidden" value="62">

How is this done?

Ok, so I was able to find the solution to my own question. I may have not provided enough details in the original question.

But the solution is simply to use the performance model as the nested field in the Fields_for instead of the bands model. Change the show model to accepts_nested_attributes_for performances and change the performance model to accepts_nested_attributes_for band

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM