Has_many throught and manual handling of updates. Is there s

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 ?

This forum is not affiliated to the Ruby language, Ruby on Rails framework, nor any Ruby applications discussed here.

| Privacy Policy | Terms of Service | Remote Ruby Jobs