codevise/snaps

View on GitHub
lib/snaps/snapshot.rb

Summary

Maintainability
A
0 mins
Test Coverage
module Snaps
  class Snapshot < Struct.new(:record, :options)
    def self.create(record, options, &block)
      new(record, options).create(&block)
    end

    def create
      copy = record.dup

      if record.respond_to?(:created_at)
        copy.created_at = record.created_at
      end

      yield(copy) if block_given?

      Tag.suppress do
        copy.save
      end

      copy.snaps_tag!(options[:tag]) if options[:tag]

      snapshot_components(copy)

      copy
    end

    private

    def snapshot_components(copy)
      each_component_with_foreign_key do |component, fk|
        component.snapshot! do |snapshot|
          snapshot[fk] = copy.id
        end
      end
    end

    def each_component_with_foreign_key
      options.fetch(:components, []).each do |association|
        fk = record.class.reflect_on_association(association).foreign_key

        record.send(association).each do |component|
          yield(component, fk)
        end
      end
    end
  end
end