X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/33afd6fa7ee7d2854eff566bbc170614ede30e1c..b0936b87f422138579352c4f2778ecbcfe0118bf:/config/initializers/composite_primary_keys.rb diff --git a/config/initializers/composite_primary_keys.rb b/config/initializers/composite_primary_keys.rb index 8fc935778..ed4d5f2c9 100644 --- a/config/initializers/composite_primary_keys.rb +++ b/config/initializers/composite_primary_keys.rb @@ -1 +1,48 @@ -require 'composite_primary_keys' +# 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