class ActiveModel::Type::Document

Attributes

cast_type[R]
collection[R]
context[R]
document_class[R]

Private Class Methods

new(class_name: nil, cast_type: nil, collection: false, context: nil) click to toggle source
# File lib/active_model/type/document.rb, line 13
def initialize(class_name: nil, cast_type: nil, collection: false, context: nil)
  @document_class = resolve_constant class_name, from: context if class_name
  @cast_type      = lookup_or_return cast_type if cast_type
  @collection     = collection
  @context        = context
end

Private Instance Methods

cast(value) click to toggle source
# File lib/active_model/type/document.rb, line 38
def cast(value)
  return unless value

  if collection?
    return value if value.respond_to? :document_class

    documents = value.map { |attributes| process attributes }

    collection_class.new(documents)
  else
    return value if value.respond_to? :id

    process value
  end
end
changed_in_place?(old_value, new_value) click to toggle source
# File lib/active_model/type/document.rb, line 70
def changed_in_place?(old_value, new_value)
  deserialize(old_value) != new_value
end
clean_scope(name) click to toggle source
# File lib/active_model/type/document.rb, line 95
def clean_scope(name)
  name.gsub(/^::/, "")
end
collection?() click to toggle source
# File lib/active_model/type/document.rb, line 20
def collection?
  collection
end
collection_class() click to toggle source
# File lib/active_model/type/document.rb, line 28
def collection_class
  return unless collection?

  if default_collection?
    @collection_class ||= ActiveModel::Embedding::Collection
  else
    @collection_class ||= resolve_constant collection, from: context
  end
end
default_collection?() click to toggle source
# File lib/active_model/type/document.rb, line 24
def default_collection?
  collection == true
end
deserialize(json) click to toggle source
# File lib/active_model/type/document.rb, line 62
def deserialize(json)
  return unless json

  value = ActiveSupport::JSON.decode(json)

  cast value
end
lookup_or_return(cast_type) click to toggle source
# File lib/active_model/type/document.rb, line 99
def lookup_or_return(cast_type)
  case cast_type
  when Symbol
    begin
      Type.lookup(cast_type)
    rescue
      ActiveRecord::Type.lookup(cast_type)
    end
  else
    cast_type
  end
end
process(value) click to toggle source
# File lib/active_model/type/document.rb, line 54
def process(value)
  cast_type ? cast_type.cast(value) : document_class.new(value)
end
resolve_constant(name, from: nil) click to toggle source
# File lib/active_model/type/document.rb, line 76
def resolve_constant(name, from: nil)
  name = clean_scope(name)

  if from
    context = from.split("::")

    context.each do
      scope    = context.join("::")
      constant = "::#{scope}::#{name}".constantize rescue nil

      return constant if constant

      context.pop
    end
  end

  "::#{name}".constantize
end
serialize(value) click to toggle source
# File lib/active_model/type/document.rb, line 58
def serialize(value)
  value.to_json
end