Updating a join table by directly accessing the model
1 2 def update 3 @project = Project.find(params[:id]) 4 if @project.update_attributes(params[:project]) 5 6 for user in user_checkboxes :selected 7 @project.update_assignment(user, params[:user_role][user.id.to_s]) 8 end 9 10 for user in user_checkboxes :unselected 11 @project.delete_assignment(user) 12 end 13 14 flash[:notice] = 'Project was successfully updated.' 15 redirect_to :action => 'show', :id => @project 16 17 else 18 render :action => 'edit' 19 end 20 end 21 22 private 23 24 def user_checkboxes(status) 25 users = [] 26 for selected_user in params[:project_users].keys 27 choice = '1' if status == :selected 28 choice = '0' if status == :unselected 29 users << User.find(selected_user) if params[:project_users][selected_user] == choice 30 end 31 return users 32 end
// project.rb
1 2 class Project < ActiveRecord::Base 3 has_many :assignments, :dependent => :destroy 4 has_many :users, :through => :assignments 5 has_many :roles, :through => :assignments 6 7 def update_assignment(user, role_id) 8 unless self.users.include?(user) 9 Assignment.create(:project_id => self.id, 10 :user_id => user.id, 11 :role_id => role_id) 12 else 13 # update existing users 14 assignment = Assignment.find_by_user_id_and_project_id(user.id, self.id) 15 assignment.role_id = role_id 16 assignment.save 17 end 18 end 19 20 def delete_assignment(user) 21 Assignment.destroy_all("user_id = #{user.id} AND project_id = #{self.id}") 22 end 23 24 end