Given the model
class Project < ActiveRecord::Base has_many :assignments has_many :assignees, :class_name => "User", :through => :assignments, :source => :user
class User < ActiveRecord::Base has_many :assignments;
class Assignment < ActiveRecord::Base belongs_to :project belongs_to :user
I am currently updating the project assignees in my ProjectsController.update
I first tried to do something like
@project.assignees = User.find(params[:assignee_ids])
but this fails as rails cannot know how to initialize my assignments. I wish it could!
I've read http://blog.hasmanythrough.com/articles/2006/08/19/magic-join-model-creation and http://blog.hasmanythrough.com/articles/2006/04/17/join-models-not-proxy-collections.
So I am updating my table doing something like:
def update @project = Project.find(params[:id]) @users = User.find(:all) if request.get? render :action => 'edit' else if params[:assignee_ids] # FIXME can't this be railsified somehow ?? this is ugly... new_assignees = User.find(params[:assignee_ids]) # remove old ones... @project.assignees.each do |old_assignee| if ! new_assignees.include? old_assignee Assignment.delete_all("user_id = #{old_assignee.id} and project_id = #{@project.id}") end end # add the new ones new_assignees.each do |new_assignee| # remove those who are not present anymore if ! @project.assignments.include? new_assignee @project.assignments.create!(:user => new_assignee) end end else # this won't work because I don't have an id column... # @project.assignments.clear Assignment.delete_all("project_id = #{@project.id}") end @project.assignments(true) if @project.update_attributes(params[:project]) flash[:notice] = 'Project was successfully updated.' redirect_to :action => 'edit', :id => @project else render :action => 'edit' end end end
Is there something simpler/cleaner ?