module DeleteRecursively::DependentIdFinder

Public Class Methods

call(owner_ids, reflection, assoc_class) click to toggle source
# File lib/delete_recursively/dependent_id_finder.rb, line 3
def call(owner_ids, reflection, assoc_class)
  owner_class = reflection.active_record

  if reflection.belongs_to?
    owners = owner_class.where(owner_class.primary_key => owner_ids)
    if reflection.polymorphic?
      owners = owners.where(reflection.foreign_type => assoc_class.to_s)
    end
    owners.pluck(reflection.foreign_key).compact
  elsif reflection.through_reflection
    dependent_ids_with_through_option(owner_ids, reflection)
  else # plain `has_many` or `has_one`
    owner_foreign_key = foreign_key(owner_class, reflection)
    reflection.klass.where(owner_foreign_key => owner_ids).ids
  end
end

Private Class Methods

dependent_ids_with_through_option(owner_ids, reflection) click to toggle source
# File lib/delete_recursively/dependent_id_finder.rb, line 22
def dependent_ids_with_through_option(owner_ids, reflection)
  through_reflection = reflection.through_reflection
  owner_foreign_key = foreign_key(reflection.active_record, through_reflection)

  dependent_class = reflection.klass
  dependent_through_reflection = inverse_through_reflection(reflection)
  dependent_foreign_key =
    foreign_key(dependent_class, dependent_through_reflection)

  through_reflection.klass
                    .where(owner_foreign_key => owner_ids)
                    .pluck(dependent_foreign_key)
end
foreign_key(owner_class, reflection) click to toggle source
# File lib/delete_recursively/dependent_id_finder.rb, line 36
def foreign_key(owner_class, reflection)
  reflection && reflection.foreign_key || owner_class.to_s.foreign_key
end
inverse_through_reflection(reflection) click to toggle source
# File lib/delete_recursively/dependent_id_finder.rb, line 40
def inverse_through_reflection(reflection)
  through_class = reflection.through_reflection.klass
  reflection.klass.reflect_on_all_associations
            .map(&:through_reflection)
            .find { |thr_ref| thr_ref && thr_ref.klass == through_class }
end