[rails] has_many … :through BUG solution.
Столкнулся сегодня с багом вызова метода 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


(7 votes, average: 4.57 out of 5)









Олег Курносов:
много букв)
Тимур Вафин:
Патчиком все таки более руляще класть…