Sha256: f285b4221a2e88bc8d080a58ed8d860b5783cb8bfd82319bffd8f77e76a8a9b1

Contents?: true

Size: 1.67 KB

Versions: 6

Compression:

Stored size: 1.67 KB

Contents

module ActiveType
  module Util

    def cast(object, klass)
      if object.is_a?(ActiveRecord::Relation)
        cast_relation(object, klass)
      elsif object.is_a?(ActiveRecord::Base)
        cast_record(object, klass)
      else
        raise ArgumentError, "Don't know how to cast #{object.inspect}"
      end
    end

    def scoped(klass_or_relation)
      klass_or_relation.where(nil)
    end

    private

    def cast_record(record, klass)
      # record.becomes(klass).dup
      klass.new do |casted|
        # Rails 3.2, 4.2
        casted.instance_variable_set(:@attributes, record.instance_variable_get(:@attributes))
        # Rails 3.2
        casted.instance_variable_set(:@attributes_cache, record.instance_variable_get(:@attributes_cache))
        # Rails 4.2
        casted.instance_variable_set(:@changed_attributes, record.instance_variable_get(:@changed_attributes))
        # Rails 5.0
        casted.instance_variable_set(:@mutation_tracker, record.instance_variable_get(:@mutation_tracker))
        # Rails 3.2, 4.2
        casted.instance_variable_set(:@new_record, record.new_record?)
        # Rails 3.2, 4.2
        casted.instance_variable_set(:@destroyed, record.destroyed?)
        # Rails 3.2, 4.2
        errors = record.errors
        if errors.kind_of? ActiveModel::Errors
          errors = errors.dup
          # otherwise attributes defined in ActiveType::Record
          # won't be visible to `errors.add`
          errors.instance_variable_set(:@base, casted)
        end
        casted.instance_variable_set(:@errors, errors)
      end
    end

    def cast_relation(relation, klass)
      scoped(klass).merge(scoped(relation))
    end

    extend self

  end
end

Version data entries

6 entries across 6 versions & 1 rubygems

Version Path
active_type-0.7.3 lib/active_type/util.rb
active_type-0.7.2 lib/active_type/util.rb
active_type-0.7.1 lib/active_type/util.rb
active_type-0.7.0 lib/active_type/util.rb
active_type-0.6.5 lib/active_type/util.rb
active_type-0.6.4 lib/active_type/util.rb