[rails] has_many … :through BUG solution.

Июль 20, 2007 3:43 пп автор admin  |  Рубрики: RubyOnRails  |  Метки:  

Столкнулся сегодня с багом вызова метода delete() для ассоциации has_many с использованием :through. Рельсы 1.2.3, так что вполне себе актуально. Чтобы это дело засветилось и в рунете тоже - переложу и сюда патч, который нашёл по этому занимательному поводу.
Класть в lib, потом в environment.rb делать require.

з.ы. вордпресс не даёт аттачить нормально, поэтому выложу inline



module ActiveRecord

  class HasManyThroughCantDisassociateNewRecords  associate.id)
      end

      # Remove +records+ from this association.  Does not destroy +records+.
      def delete(*records)
         return if records.empty?
         records.each { |associate| raise_on_type_mismatch(associate) }
         through = @reflection.through_reflection
         raise ActiveRecord::HasManyThroughCantDisassociateNewRecords.new(@owner, through) if @owner.new_record?

         load_target

         klass = through.klass
         klass.transaction do
           flatten_deeper(records).each do |associate|
             raise_on_type_mismatch(associate)
             raise ActiveRecord::HasManyThroughCantDisassociateNewRecords.new(@owner, through) unless associate.respond_to?(:new_record?) && !associate.new_record?

             @owner.send(@reflection.through_reflection.name).proxy_target.delete(klass.delete_all(construct_join_attributes(associate)))
             @target.delete(associate)
           end
         end

         self
       end
    end
  end
end
1 Star2 Stars3 Stars4 Stars5 Stars (7 votes, average: 4.57 out of 5)
Loading ... Loading ...

Добавить комментарий »

Олег Курносов:

много букв)

( Comment от Олег Курносов — Июль 21, 2007 @ 2:25 пп )
Тимур Вафин:

Патчиком все таки более руляще класть…

( Comment от Тимур Вафин — Октябрь 15, 2007 @ 11:58 дп )

Оставить комментарий