X-Git-Url: https://git.openstreetmap.org/rails.git/blobdiff_plain/e7346e590342bf41aa0262e89498b28111c97f6f..be088602fbd0bfe01f982ea40d9dd34b00afb547:/config/initializers/composite_primary_keys.rb diff --git a/config/initializers/composite_primary_keys.rb b/config/initializers/composite_primary_keys.rb index 017408e9e..ed4d5f2c9 100644 --- a/config/initializers/composite_primary_keys.rb +++ b/config/initializers/composite_primary_keys.rb @@ -1,2 +1,48 @@ -require 'rubygems' -gem 'composite_primary_keys', '= 0.9.93' +# 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