Sha256: f66fd49f2c4050d2135e62e09bac52af98a1e6b29260a9ae0e3bf1c8acfc150d

Contents?: true

Size: 1.3 KB

Versions: 1

Compression:

Stored size: 1.3 KB

Contents

module Reflections
  class Remapper
    REMAPPERS = []
    attr_reader :from_obj, :to_obj

    def initialize(from, to)
      @from_obj = from
      @to_obj = to
    end

    def remap(options={}, &block)
      protect_remap_from_other_classes
      @only_these_classes = options.fetch(:only) { ActiveRecord::Base.descendants }
      @except_these_classes = options.fetch(:except) { [] }
      remap_these = options.fetch(:types) { REMAPPERS }
      remap_these.each do |remapper|
        remapper_class = "Reflections::Remappers::#{remapper.to_s.camelize}".constantize
        remapper_class.new(from_obj, to_obj).remap(ar_classes, &block)
      end
    end

    protected

    def ar_classes
      @only_these_classes - @except_these_classes
    end

    private

    def protect_remap_from_other_classes
      if from_obj.class != to_obj.class
        raise NotSameClass, "#{from_obj.class} is not the same class as #{to_obj.class}"
      end
    end

    def update_record_or_yield(record, association)
      if !block_given? || block_given? && yield(record, from_obj, to_obj)
        update_record record, association
      end
    end

    def associations_for_class(ar_class)
      filter = filter_for_class from_obj.class
      associations(ar_class).select &filter
    end

    class NotSameClass < RuntimeError; end
  end
end

Version data entries

1 entries across 1 versions & 1 rubygems

Version Path
reflections-1.2.0 lib/reflections/remapper.rb