How to update the extra field of relationship table when use have_many :throuth effectively

I defined the relationship of two tables as below:

Programme(id,code,name) Course(id,code,name) ProgarmmeCourse(id,programme_id,course_id,status)

class Programme < ActiveRecord::Base   has_many :programme_courses,:dependent=>:destroy end

class ProgrammeCourse < ActiveRecord::Base   belongs_to :programme   belongs_to :course
end

class Course < ActiveRecord::Base   has_many :programmes,:through=>:programme_courses end

there are a list of courses belong to a programme on Programme's update page, i can update the status(enable/disable) of course belong to the programme or add a new course from a list of course.

how to save the field of status(enable/disable) effectively after save Programme?

Could you please give me a sample? Thanks for your help

What you’re asking is how to set attributes on the join model. Josh Susser covered one way to do this here: http://blog.hasmanythrough.com/2006/8/19/magic-join-model-creation with his push_with_attributes method on the association. You use it like this:

class Programme < ActiveRecord::Base has_many :programme_courses,:dependent => :destroy has_many :courses, :through => :programme_courses do def push_with_attributes(element, attributes = {})

  ProgrammeCourse.send :with_scope, {:create => attributes} do
    self << element
  end
end

end end

To create the relationship between a Course and a Programme with a status value on the join model you can use it like this:

c = Course.find :first p = Programme.find :first p.courses.push_with_attributes(c, :status => ENABLED) # Or whatever you’re setting status to

To set the value on the join model after it’s been created, you have to do something more like

ProgrammeCourse.find_by_programme_id_and_course_id(p, c).update_attribute :status, DISABLED # Or whatever you’re setting status to

Of course you should refactor these for simplicity in your application. There are probably nicer ways to do this nowadays but I’m not sure what they are.

Cheers, Morgan.