module ActiveRecord::VirtualAttributes::ClassMethods

Public Instance Methods

virtual_attribute(name, type, **options) click to toggle source
# File lib/active_record/virtual_attributes.rb, line 58
def virtual_attribute(name, type, **options)
  name = name.to_s
  reload_schema_from_cache

  self.virtual_attributes_to_define =
    virtual_attributes_to_define.merge(name => [type, options])
end
virtual_attribute?(name) click to toggle source

Introspection

# File lib/active_record/virtual_attributes.rb, line 70
def virtual_attribute?(name)
  load_schema
  has_attribute?(name) && (
    !respond_to?(:column_for_attribute) ||
    column_for_attribute(name).kind_of?(ActiveRecord::ConnectionAdapters::NullColumn)
  )
end
virtual_attribute_names() click to toggle source
# File lib/active_record/virtual_attributes.rb, line 78
def virtual_attribute_names
  if respond_to?(:column_names)
    attribute_names - column_names
  else
    attribute_names
  end
end
virtual_column(name, **options) click to toggle source

Compatibility method: `virtual_attribute` is a more accurate name

# File lib/active_record/virtual_attributes.rb, line 51
def virtual_column(name, **options)
  type = options.delete(:type)
  raise ArgumentError, "missing :type attribute" unless type

  virtual_attribute(name, type, **options)
end

Private Instance Methods

define_virtual_attribute(name, cast_type, uses: nil, arel: nil) click to toggle source
# File lib/active_record/virtual_attributes.rb, line 118
def define_virtual_attribute(name, cast_type, uses: nil, arel: nil)
  attribute_types[name] = cast_type
  define_virtual_include(name, uses) if uses
  define_virtual_arel(name, arel) if arel
end
load_schema!() click to toggle source
Calls superclass method
# File lib/active_record/virtual_attributes.rb, line 103
def load_schema!
  super

  virtual_attributes_to_define.each do |name, (type, options)|
    type = type.call if type.respond_to?(:call)
    type = ActiveRecord::Type.lookup(type, **options.except(:uses, :arel)) if type.kind_of?(Symbol)

    define_virtual_attribute(name, type, **options.slice(:uses, :arel))
  end

  virtual_delegates_to_define.each do |method_name, (method, options)|
    define_virtual_delegate(method_name, method, options)
  end
end