class QuickClone::Cloner

Constants

ABSOLUTE_EXCLUDE
ATTRIBUTE_CLASSES
SINGULAR_ASSOCIATIONS

Public Class Methods

clone_from(original_object, filter) click to toggle source
# File lib/quick_clone/cloner.rb, line 30
def self.clone_from(original_object, filter)
  new(original_object, filter).clone
end
new(original_object, filter) click to toggle source
# File lib/quick_clone/cloner.rb, line 34
def initialize(original_object, filter)
  @filter = filter

  @original_object = original_object
  @new_object = original_object.class.new
end

Public Instance Methods

clone() click to toggle source
# File lib/quick_clone/cloner.rb, line 41
def clone
  determine_clone(@original_object, @new_object, @filter)
  @new_object
end

Private Instance Methods

copy_association(original_object, new_object, association_name, association_filter) click to toggle source
# File lib/quick_clone/cloner.rb, line 65
def copy_association(original_object, new_object, association_name, association_filter)
  if SINGULAR_ASSOCIATIONS.include?(original_object.class.reflect_on_association(association_name).macro)
    determine_clone(original_object.send(association_name),
                    new_object.send("build_#{association_name}"),
                    association_filter)
  else
    original_object.send(association_name).each do |association_original_object|
      determine_clone(association_original_object, new_object.send(association_name).build, association_filter)
    end
  end
end
copy_attribute(original_object, new_object, field) click to toggle source
# File lib/quick_clone/cloner.rb, line 61
def copy_attribute(original_object, new_object, field)
  new_object.send("#{field}=", original_object.send(field))
end
determine_clone(original_object, new_object, filter) click to toggle source
# File lib/quick_clone/cloner.rb, line 48
def determine_clone(original_object, new_object, filter)
  filter.each do |field|
    if ATTRIBUTE_CLASSES.include? field.class.name
      next if ABSOLUTE_EXCLUDE.include?(field.to_sym)
      copy_attribute(original_object, new_object, field)
    elsif field.is_a? Hash
      field.each do |association_name, association_filter|
        copy_association(original_object, new_object, association_name, association_filter)
      end
    end
  end
end