Module: ActiveRecord::VirtualAttributes::VirtualReflections::ClassMethods

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

Instance Method Summary collapse

Instance Method Details

#collect_reflections(association_names) ⇒ Object

invalid associations return a nil real reflections are followed a virtual association will stop the traversal



68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
# File 'lib/active_record/virtual_attributes/virtual_reflections.rb', line 68

def collect_reflections(association_names)
  klass = self
  association_names.each_with_object([]) do |name, ret|
    reflection = klass.reflect_on_association(name)
    if reflection.nil?
      if klass.reflection_with_virtual(name)
        break(ret)
      else
        break
      end
    end
    klass = reflection.klass
    ret << reflection
  end
end

#collect_reflections_with_virtual(association_names) ⇒ Object



84
85
86
87
88
89
90
91
# File 'lib/active_record/virtual_attributes/virtual_reflections.rb', line 84

def collect_reflections_with_virtual(association_names)
  klass = self
  association_names.collect do |name|
    reflection = klass.reflection_with_virtual(name) || break
    klass = reflection.klass
    reflection
  end
end

#follow_associations(association_names) ⇒ Object



56
57
58
# File 'lib/active_record/virtual_attributes/virtual_reflections.rb', line 56

def follow_associations(association_names)
  association_names.inject(self) { |klass, name| klass&.reflect_on_association(name)&.klass }
end

#follow_associations_with_virtual(association_names) ⇒ Object



60
61
62
# File 'lib/active_record/virtual_attributes/virtual_reflections.rb', line 60

def follow_associations_with_virtual(association_names)
  association_names.inject(self) { |klass, name| klass&.reflection_with_virtual(name)&.klass }
end

#reflection_with_virtual(association) ⇒ Object



52
53
54
# File 'lib/active_record/virtual_attributes/virtual_reflections.rb', line 52

def reflection_with_virtual(association)
  virtual_reflection(association) || reflect_on_association(association)
end

#reflections_with_virtualObject



48
49
50
# File 'lib/active_record/virtual_attributes/virtual_reflections.rb', line 48

def reflections_with_virtual
  reflections.symbolize_keys.merge(virtual_reflections)
end

#virtual_belongs_to(name, uses: nil, **options) ⇒ Object



27
28
29
30
# File 'lib/active_record/virtual_attributes/virtual_reflections.rb', line 27

def virtual_belongs_to(name, uses: nil, **options)
  reflection = ActiveRecord::Associations::Builder::BelongsTo.build(self, name, nil, options)
  add_virtual_reflection(reflection, name, uses)
end

#virtual_has_many(name, uses: nil, source: name, through: nil, **options) ⇒ Object



17
18
19
20
21
22
23
24
25
# File 'lib/active_record/virtual_attributes/virtual_reflections.rb', line 17

def virtual_has_many(name, uses: nil, source: name, through: nil, **options)
  define_method(:"#{name.to_s.singularize}_ids") do
    records = send(name)
    records.respond_to?(:ids) ? records.ids : records.collect(&:id)
  end
  define_delegate(name, source, :to => through, :allow_nil => true, :default => []) if through
  reflection = ActiveRecord::Associations::Builder::HasMany.build(self, name, nil, options)
  add_virtual_reflection(reflection, name, uses)
end

#virtual_has_one(name, uses: nil, **options) ⇒ Object

Definition



12
13
14
15
# File 'lib/active_record/virtual_attributes/virtual_reflections.rb', line 12

def virtual_has_one(name, uses: nil, **options)
  reflection = ActiveRecord::Associations::Builder::HasOne.build(self, name, nil, options)
  add_virtual_reflection(reflection, name, uses)
end

#virtual_reflection(name) ⇒ Object



36
37
38
# File 'lib/active_record/virtual_attributes/virtual_reflections.rb', line 36

def virtual_reflection(name)
  virtual_reflections[name.to_sym]
end

#virtual_reflection?(name) ⇒ Boolean



32
33
34
# File 'lib/active_record/virtual_attributes/virtual_reflections.rb', line 32

def virtual_reflection?(name)
  virtual_reflections.key?(name.to_sym)
end

#virtual_reflectionsObject

Introspection



44
45
46
# File 'lib/active_record/virtual_attributes/virtual_reflections.rb', line 44

def virtual_reflections
  (virtual_fields_base? ? {} : superclass.virtual_reflections).merge(_virtual_reflections)
end