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