From: Tom Hughes Date: Mon, 14 Oct 2013 23:17:39 +0000 (+0100) Subject: Monkey patch composite_primary_keys to fix deletes via has_many X-Git-Tag: live~4660 X-Git-Url: https://git.openstreetmap.org/rails.git/commitdiff_plain/b0936b87f422138579352c4f2778ecbcfe0118bf?ds=sidebyside Monkey patch composite_primary_keys to fix deletes via has_many https://github.com/composite-primary-keys/composite_primary_keys/pull/170 --- diff --git a/config/initializers/composite_primary_keys.rb b/config/initializers/composite_primary_keys.rb new file mode 100644 index 000000000..ed4d5f2c9 --- /dev/null +++ b/config/initializers/composite_primary_keys.rb @@ -0,0 +1,48 @@ +# Monkey patch composite_primary_keys pending the resolution of: +# https://github.com/composite-primary-keys/composite_primary_keys/pull/170 +module ActiveRecord + module Associations + class HasManyAssociation + def delete_records(records, method) + if method == :destroy + records.each { |r| r.destroy } + update_counter(-records.length) unless inverse_updates_counter_cache? + else + if records == :all + scope = self.scope + else + # CPK + # keys = records.map { |r| r[reflection.association_primary_key] } + # scope = scope.where(reflection.association_primary_key => keys) + table = Arel::Table.new(reflection.table_name) + and_conditions = records.map do |record| + eq_conditions = Array(reflection.association_primary_key).map do |name| + table[name].eq(record[name]) + end + Arel::Nodes::And.new(eq_conditions) + end + + condition = and_conditions.shift + and_conditions.each do |and_condition| + condition = condition.or(and_condition) + end + + scope = self.scope.where(condition) + end + + if method == :delete_all + update_counter(-scope.delete_all) + else + # CPK + # update_counter(-scope.update_all(reflection.foreign_key => nil)) + updates = Array(reflection.foreign_key).inject(Hash.new) do |hash, name| + hash[name] = nil + hash + end + update_counter(-scope.update_all(updates)) + end + end + end + end + end +end