123456789_123456789_123456789_123456789_123456789_

Class: ActiveModel::LazyAttributeSet

Do not use. This class is for internal use only.
Relationships & Source Files
Super Chains via Extension / Inclusion / Inheritance
Class Chain:
self, AttributeSet
Instance Chain:
self, AttributeSet
Inherits: ActiveModel::AttributeSet
Defined in: activemodel/lib/active_model/attribute_set.rb

Class Method Summary

Instance Attribute Summary

AttributeSet - Inherited

Instance Method Summary

Constructor Details

.new(values, types, additional_types, default_attributes, attributes, default_keys) ⇒ LazyAttributeSet

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 209

def initialize(values, types, additional_types, default_attributes, attributes, default_keys)
  super(attributes)
  @values = values
  @types = types
  @additional_types = additional_types
  @default_attributes = default_attributes
  @default_keys = default_keys
  @casted_values = values.is_a?(IndexedRow) ? values.new_empty_mutable_row : {}
  @materialized = false
end

Instance Attribute Details

#additional_types (readonly, private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 309

attr_reader :values, :types, :additional_types, :default_attributes

#default_attributes (readonly, private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 309

attr_reader :values, :types, :additional_types, :default_attributes

#types (readonly, private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 309

attr_reader :values, :types, :additional_types, :default_attributes

#values (readonly, private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 309

attr_reader :values, :types, :additional_types, :default_attributes

Instance Method Details

#attributes (protected)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 289

def attributes
  unless @materialized
    if @attributes.empty?
      values.each_key { |key| self[key] }
      types.each_key { |key| self[key] }
    else
      assigned_attributes = @attributes
      @attributes = {}

      (values.keys | types.keys | assigned_attributes.keys).each do |key|
        @attributes[key] = assigned_attributes[key] || self[key]
      end
    end

    @materialized = true
  end
  @attributes
end

#deep_dup

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 266

def deep_dup
  LazyAttributeSet.new(
    values.dup,
    types.dup,
    additional_types.dup,
    default_attributes.dup,
    attributes.transform_values(&:deep_dup),
    @default_keys
  )
end

#default_attribute(name, value_present = true, value = values.fetch(name) { value_present = false }) (private)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 311

def default_attribute(
  name,
  value_present = true,
  value = values.fetch(name) { value_present = false }
)
  type = additional_types.fetch(name, types[name])

  if value_present
    @attributes[name] = Attribute.from_database(name, value, type, @casted_values[name])
  elsif types.key?(name)
    if (@default_keys.nil? || @default_keys.include?(name)) && (attr = default_attributes[name])
      @attributes[name] = attr.dup
    else
      @attributes[name] = Attribute.uninitialized(name, type)
    end
  else
    Attribute.null(name)
  end
end

#fetch_value(name, &block)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 229

def fetch_value(name, &block)
  if attr = @attributes[name]
    return attr.value(&block)
  end

  @casted_values.fetch(name) do
    value_present = true
    value = values.fetch(name) { value_present = false }

    if value_present
      type = additional_types.fetch(name, types[name])
      @casted_values[name] = type.deserialize(value)
    else
      attr = default_attribute(name, value_present, value)
      attr.value(&block)
    end
  end
end

#fetch_value!(name)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 248

def fetch_value!(name)
  if attr = @attributes[name]
    return attr.value!
  end

  @casted_values.fetch(name) do
    value_present = true
    value = values.fetch(name) { value_present = false }

    if value_present
      type = additional_types.fetch(name, types[name])
      @casted_values[name] = type.deserialize(value)
    else
      default_attribute(name, value_present, value).value!
    end
  end
end

#key?(name) ⇒ Boolean

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 220

def key?(name)
  values.key?(name) || ((types.key?(name) || @attributes.key?(name)) && self[name].initialized?)
end

#keys

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 224

def keys
  keys = values.keys | types.keys | @attributes.keys
  keys.keep_if { |name| self[name].initialized? }
end

#map(&block)

[ GitHub ]

  
# File 'activemodel/lib/active_model/attribute_set.rb', line 277

def map(&block)
  LazyAttributeSet.new(
    values,
    types,
    additional_types,
    default_attributes,
    attributes.transform_values(&block),
    @default_keys
  )
end