I have Gig and Singer Active Record models (standard--no customization just yet) with a many-to-many relationship through a generic join table which holds nothing but the respective ids of Gig and Singer. My form sends a given gig id and all the singers who will be attending, denoted with check boxes. I need to have the ability to check or uncheck singers. The following code works, but it does so by removing all the singers from a gig and re-adding them. This feels hacky... is there a better way? (I think this is all the code necessary but let me know if you need me to add anything)
class GigSingersController < ApplicationController
def create
gig = Gig.find(params[:gig_id])
singer_ids = params[:singer_ids] # [1, 4, 5,]
gig.singers = []
singer_ids.each do |id|
singer = Singer.find(id)
gig.singers << singer
end
redirect_to gigs_path
end
end
EDIT:
As requested in the comments, here are the schema and relevant models, although as I said, they are completely generic. Perhaps I didn't do a good job of making my question clear: Is the best way to create these relationships when using a checkbox to remove all existing ones and recreate them from the boxes currently checked, thereby removing any that the user unchecked on an edit?
ActiveRecord::Schema.define(version: 2019_07_19_195106) do
create_table "gig_singers", force: :cascade do |t|
t.integer "gig_id"
t.integer "singer_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "gigs", force: :cascade do |t|
t.string "name"
t.text "notes"
t.datetime "datetime"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
create_table "singers", force: :cascade do |t|
t.string "name"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
t.boolean "active"
end
class Gig < ApplicationRecord
has_many :gig_singers
has_many :singers, through: :gig_singers
end
class GigSinger < ApplicationRecord
belongs_to :gig
belongs_to :singer
end
class Singer < ApplicationRecord
has_many :gig_singers
has_many :gigs, through: :gig_singers
end