[Nitro] og: automatic deletion of records in M:N relations?

Jonathan Buch john at oxyliquit.de
Sun Aug 27 14:01:56 EDT 2006


Hi,

> a = Item.new
> a.tags << Tag.new
> a.delete(true) # << this makes a cascade while deleting, should also
> remove the relations

on the other hand, while researching the matter, I found out that  
cascading is the default.  And yes, works with relations, not with  
many_to_many though... Only with simple belongs_to...

I have a solution right here, but it ain't exactly nice...

put in place in joins_many.rb, enchant:

...

     if through = self[:through]
       # A custom class is used for the join. Use the class
       # table and don't create a new table.
       through = Relation.symbol_to_class(through, owner_class) if  
through.is_a?(Symbol)
       join_table = self[:join_table] = store.table(through)

       tmp_join_class = through
     else
       # Calculate the name of the join table.
       join_table = self[:join_table] = join_table_info[:table]
       # Create a join table.
       owner_class.ann :self, :join_tables => [] unless  
owner_class.ann.self.join_tables?
       owner_class.ann.self.join_tables! << join_table_info

       # handle for ann.descendants to cascade deletes

       tmp_join_class_name =  
"OgTempJ_#{owner_class.to_s.demodulize}_#{join_class.to_s.demodulize}"
       eval("class #{tmp_join_class_name}; OGTABLE = '#{join_table}'; end;")
       tmp_join_class = constant(tmp_join_class_name)
     end

     owner_key = join_table_info[:owner_key]
     target_key = join_table_info[:target_key]

     unless owner_class.ann.self[:descendants]
       owner_class.ann(:self, :descendants => [])
     end
     owner_class.ann.self.descendants! << [tmp_join_class, owner_key]

     owner_class.module_eval %{
       attr_accessor :#{target_plural_name}

...

Not exacytly nice, but does what you want :)

It will delete the relationship with the Tag, not the Tag itself.

Jo

-- 
Feel the love
http://pinkjuice.com/pics/ruby.png


More information about the Nitro-general mailing list