module ActiveRecord::VirtualAttributes::VirtualFields::ClassMethods

Public Instance Methods

include_to_hash(value) click to toggle source

@param [Hash, Array, String, Symbol] value @return [Hash]

# File lib/active_record/virtual_attributes/virtual_fields.rb, line 67
def include_to_hash(value)
  case value
  when String, Symbol
    {value => {}}
  when Array
    value.flatten.each_with_object({}) { |k, h| h[k] = {} }
  when nil
    {}
  else
    value
  end
end
merge_includes(hash1, hash2) click to toggle source

@param [Hash] hash1 @param [Hash] hash2

# File lib/active_record/virtual_attributes/virtual_fields.rb, line 82
def merge_includes(hash1, hash2)
  return hash1 if hash2.blank?

  hash1 = include_to_hash(hash1)
  hash2 = include_to_hash(hash2)
  hash1.deep_merge!(hash2) do |_k, v1, v2|
    merge_includes(v1, v2)
  end
end
replace_virtual_field_hash(associations) click to toggle source
# File lib/active_record/virtual_attributes/virtual_fields.rb, line 48
def replace_virtual_field_hash(associations)
  associations.each_with_object({}) do |(parent, child), h|
    if virtual_field?(parent) # form virtual_attribute => {}
      merge_includes(h, replace_virtual_fields(virtual_includes(parent)))
    else
      reflection = reflect_on_association(parent.to_sym)
      if reflection.nil?
        merge_includes(h, parent)
      elsif reflection.options[:polymorphic]
        merge_includes(h, parent => child)
      else
        merge_includes(h, parent => reflection.klass.replace_virtual_fields(child) || {})
      end
    end
  end
end
replace_virtual_fields(associations) click to toggle source
# File lib/active_record/virtual_attributes/virtual_fields.rb, line 33
def replace_virtual_fields(associations)
  return associations if associations.blank?

  case associations
  when String, Symbol
    virtual_field?(associations) ? replace_virtual_fields(virtual_includes(associations)) : associations
  when Array
    associations.collect { |association| replace_virtual_fields(association) }.compact
  when Hash
    replace_virtual_field_hash(associations)
  else
    associations
  end
end
virtual_field?(name) click to toggle source
# File lib/active_record/virtual_attributes/virtual_fields.rb, line 29
def virtual_field?(name)
  virtual_attribute?(name) || virtual_reflection?(name)
end
virtual_fields_base?() click to toggle source
# File lib/active_record/virtual_attributes/virtual_fields.rb, line 25
def virtual_fields_base?
  !(superclass < VirtualFields)
end