module ActiveType::VirtualAttributes

Public Class Methods

attribute_for_inspect(value) click to toggle source
# File lib/active_type/virtual_attributes.rb, line 273
def self.attribute_for_inspect(value)
  if value.is_a?(String) && value.length > 50
    "#{value[0, 50]}...".inspect
  elsif value.is_a?(Date) || value.is_a?(Time)
    %("#{value.to_formatted_s(:db)}")
  elsif value.is_a?(Array) && value.size > 10
    inspected = value.first(10).inspect
    %(#{inspected[0...-1]}, ...])
  else
    value.inspect
  end
end
deep_dup(hash) click to toggle source
# File lib/active_type/virtual_attributes.rb, line 122
def self.deep_dup(hash)
  result = hash.dup
  result.each do |key, value|
    result[key] = value.dup if value.duplicable?
  end
  result
end

Public Instance Methods

[](name) click to toggle source
Calls superclass method
# File lib/active_type/virtual_attributes.rb, line 181
def [](name)
  read_existing_virtual_attribute(name) { super }
end
[]=(name, value) click to toggle source
Calls superclass method
# File lib/active_type/virtual_attributes.rb, line 198
def []=(name, value)
  write_existing_virtual_attribute(name, value) { super }
end
_read_attribute(name) click to toggle source
Calls superclass method
# File lib/active_type/virtual_attributes.rb, line 186
def _read_attribute(name)
  read_existing_virtual_attribute(name) { super }
end
_write_attribute(name, value) click to toggle source
Calls superclass method
# File lib/active_type/virtual_attributes.rb, line 203
def _write_attribute(name, value)
  write_existing_virtual_attribute(name, value) { super }
end
attributes() click to toggle source
Calls superclass method
# File lib/active_type/virtual_attributes.rb, line 215
def attributes
  self.class._virtual_column_names.each_with_object(super) do |name, attrs|
    attrs[name] = read_virtual_attribute(name)
  end
end
changed?() click to toggle source
Calls superclass method
# File lib/active_type/virtual_attributes.rb, line 221
def changed?
  self.class._virtual_column_names.any? { |attr| virtual_attributes_were[attr] != send(attr) } || super
end
changes() click to toggle source
Calls superclass method
# File lib/active_type/virtual_attributes.rb, line 225
def changes
  changes = self.class._virtual_column_names.each_with_object({}) do |attr, changes|
    current_value = send(attr)
    previous_value = virtual_attributes_were[attr]
    changes[attr] = [previous_value, current_value] if  previous_value != current_value
  end

  super.merge(changes)
end
changes_applied() click to toggle source
Calls superclass method
# File lib/active_type/virtual_attributes.rb, line 236
def changes_applied
  super

  virtual_attributes.each do |attr, _|
    value = read_virtual_attribute(attr)
    virtual_attributes_were[attr] = value.duplicable? ? value.clone : value
  end
end
initialize_dup(other) click to toggle source
Calls superclass method
# File lib/active_type/virtual_attributes.rb, line 145
def initialize_dup(other)
  @virtual_attributes_cache = {}
  @virtual_attributes = VirtualAttributes.deep_dup(virtual_attributes)
  @virtual_attributes_were = VirtualAttributes.deep_dup(virtual_attributes_were)

  super
end
inspect() click to toggle source

Returns the contents of the record as a nicely formatted string.

# File lib/active_type/virtual_attributes.rb, line 266
def inspect
  inspection = attributes.collect do |name, value|
    "#{name}: #{VirtualAttributes.attribute_for_inspect(value)}"
  end.sort.compact.join(", ")
  "#<#{self.class} #{inspection}>"
end
read_attribute(name) click to toggle source

in 6.1, read_attribute does not call _read_attribute

Calls superclass method
# File lib/active_type/virtual_attributes.rb, line 193
def read_attribute(name)
  read_existing_virtual_attribute(name) { super }
end
read_existing_virtual_attribute(name) { || ... } click to toggle source
# File lib/active_type/virtual_attributes.rb, line 165
def read_existing_virtual_attribute(name, &block_when_not_virtual)
  if self.singleton_class._has_virtual_column?(name)
    read_virtual_attribute(name)
  else
    yield
  end
end
read_virtual_attribute(name) click to toggle source
# File lib/active_type/virtual_attributes.rb, line 246
def read_virtual_attribute(name)
  name = name.to_s
  if virtual_attributes_cache.has_key?(name)
    virtual_attributes_cache[name]
  else
    virtual_attributes_cache[name] = begin
      virtual_column = self.singleton_class._virtual_column(name)
      raw_value = virtual_attributes.fetch(name) { virtual_column.default_value(self) }
      virtual_column.type_cast(raw_value)
    end
  end
end
virtual_attributes() click to toggle source
# File lib/active_type/virtual_attributes.rb, line 153
def virtual_attributes
  @virtual_attributes ||= {}
end
virtual_attributes_cache() click to toggle source
# File lib/active_type/virtual_attributes.rb, line 161
def virtual_attributes_cache
  @virtual_attributes_cache ||= {}
end
virtual_attributes_were() click to toggle source
# File lib/active_type/virtual_attributes.rb, line 157
def virtual_attributes_were
  @virtual_attributes_were ||= {}
end
write_attribute(name, value) click to toggle source

in 6.1, write_attribute does not call _write_attribute

Calls superclass method
# File lib/active_type/virtual_attributes.rb, line 210
def write_attribute(name, value)
  write_existing_virtual_attribute(name, value) { super }
end
write_existing_virtual_attribute(name, value) { || ... } click to toggle source
# File lib/active_type/virtual_attributes.rb, line 173
def write_existing_virtual_attribute(name, value, &block_when_not_virtual)
  if self.singleton_class._has_virtual_column?(name)
    write_virtual_attribute(name, value)
  else
    yield
  end
end
write_virtual_attribute(name, value) click to toggle source
# File lib/active_type/virtual_attributes.rb, line 259
def write_virtual_attribute(name, value)
  name = name.to_s
  virtual_attributes_cache.delete(name)
  virtual_attributes[name] = value
end

Private Instance Methods

attribute_names_for_serialization() click to toggle source
Calls superclass method
# File lib/active_type/virtual_attributes.rb, line 289
def attribute_names_for_serialization
  super + self.class._virtual_column_names
end