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
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
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