I have a join model represented by has_many :through with some  
conditions. Thanks to Jeremy Kemper''s patches (http:// 
dev.rubyonrails.org/changeset/4786), I can add records to the  
collection. However, since I have a condition on the finders  
referencing an attribute, I would also like to set that attribute  
when I add records to the collection. Since Jeremy''s extensions
don''t
support before_add and after_add, the only solution I found was to  
add an extension and override the association methods.
Some code:
Here is the first association:
has_many :partner_children,
   :class_name => ''ClientsPartner'',
   :foreign_key => ''partner_id''
Here is what I would like to do:
Role.find(:all).each do |role|
   has_many :"children_as_#{role.short_name}",
     :through => :partner_children, :source => :client,
     :conditions => ["role_id = ?", role.id],
     :before_add => lambda { (set attributes on join model) }
end
And here is what I ended up with:
Role.find(:all).each do |role|
   children_as_role_extension = Module.new
   children_as_role_extension.module_eval(<<-EOT)
     def <<(*records)
       records.each do |record|
         @owner.partner_children.create(:client => record, :role_id  
=> #{role.id})
       end
       reload
     end
     def delete(record)
       @owner.partner_children.find(:all, :conditions =>
           ["client_id = ? and role_id = ?", record.id, #{role.id}]
       ).each(&:destroy)
       reload
     end
     def clear
       @owner.partner_children.find(:all, :conditions =>
           ["role_id = ?", #{role.id}]
       ).each(&:destroy)
       reload
     end
   EOT
   has_many :"children_as_#{role.short_name}",
     :through => :partner_children, :source => :client,
     :conditions => ["role_id = ?", role.id], :extend =>  
children_as_role_extension
end
--~--~---------~--~----~------------~-------~--~----~
You received this message because you are subscribed to the Google Groups
"Ruby on Rails: Talk" group.
To post to this group, send email to
rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
To unsubscribe from this group, send email to
rubyonrails-talk-unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org
For more options, visit this group at
http://groups.google.com/group/rubyonrails-talk
-~----------~----~----~----~------~----~------~--~---