Sha256: 53ea99c8c439cba24abea3869750b3feafe2082ae04ed26952d429a4e9f29afb

Contents?: true

Size: 1.26 KB

Versions: 18

Compression:

Stored size: 1.26 KB

Contents

# -*- encoding : utf-8 -*-
module AbAdmin
  module Concerns
    module DeepCloneable

      def deep_duplicate(*args)
        deep_dup(false, *args)
      end

      def deep_dup(target, *args)
        dupl = target || self.dup

        args.reject! { |a| a.blank? }
        return dupl if args.empty?

        args.each do |arg|
          case arg
            when Hash
              arg.each do |k, v|
                dup_simple(dupl, k, v)
              end
            else
              Array(arg).each do |k|
                if k.kind_of?(Hash) || k.kind_of?(Array)
                  self.deep_dup(dupl, k)
                else
                  dup_simple(dupl, k)
                end
              end
          end
        end

        dupl
      end

      def dup_simple(dupl, k, v=nil)
        if check_assoc(k).collection?
          self.send(k).each do |rec|
            dupl.send(k) << (v ? rec.deep_dup(false, v) : rec.dup)
          end
        else
          dupl.send("#{k}=", (v ? self.send(k).deep_dup(false, v) : self.send(k).dup))
        end

        dupl
      end

      def check_assoc(assoc_method)
        raise "Target has no association #{assoc_method}" unless assoc = self.class.reflect_on_association(assoc_method)
        assoc
      end

    end
  end
end

Version data entries

18 entries across 18 versions & 1 rubygems

Version Path
ab_admin-0.6.1 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.6.0 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.5.0 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.4.0 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.3.6 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.3.5 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.3.4 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.3.3 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.3.2 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.3.1 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.3.0 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.2.3 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.2.2 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.2.1 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.2.0 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.1.2 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.1.1 lib/ab_admin/concerns/deep_cloneable.rb
ab_admin-0.1.0 lib/ab_admin/concerns/deep_cloneable.rb