Module: ActiveRecord::VirtualAttributes::VirtualFields::ClassMethods

Defined in:
lib/active_record/virtual_attributes/virtual_fields.rb

Instance Method Summary collapse

Instance Method Details

#include_to_hash(value) ⇒ Hash

Parameters:

  • value (Hash, Array, String, Symbol)

Returns:

  • (Hash)


67
68
69
70
71
72
73
74
75
76
77
78
# 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) ⇒ Object

Parameters:

  • hash1 (Hash)
  • hash2 (Hash)


82
83
84
85
86
87
88
89
90
# 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) ⇒ Object



48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
# 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) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
44
45
46
# 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) ⇒ Boolean

Returns:

  • (Boolean)


29
30
31
# 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?Boolean

Returns:

  • (Boolean)


25
26
27
# File 'lib/active_record/virtual_attributes/virtual_fields.rb', line 25

def virtual_fields_base?
  !(superclass < VirtualFields)
end