From b0936b87f422138579352c4f2778ecbcfe0118bf Mon Sep 17 00:00:00 2001 From: Tom Hughes Date: Tue, 15 Oct 2013 00:17:39 +0100 Subject: [PATCH] Monkey patch composite_primary_keys to fix deletes via has_many https://github.com/composite-primary-keys/composite_primary_keys/pull/170 --- config/initializers/composite_primary_keys.rb | 48 +++++++++++++++++++ 1 file changed, 48 insertions(+) create mode 100644 config/initializers/composite_primary_keys.rb 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 -- 2.43.2