Module: ActiveRecord::VirtualAttributes::VirtualReflections::ClassMethods
- Defined in:
- lib/active_record/virtual_attributes/virtual_reflections.rb
Instance Method Summary collapse
-
#collect_reflections(association_names) ⇒ Object
invalid associations return a nil real reflections are followed a virtual association will stop the traversal.
- #collect_reflections_with_virtual(association_names) ⇒ Object
- #follow_associations(association_names) ⇒ Object
- #follow_associations_with_virtual(association_names) ⇒ Object
- #reflection_with_virtual(association) ⇒ Object
- #reflections_with_virtual ⇒ Object
- #virtual_belongs_to(name, uses: nil, **options) ⇒ Object
- #virtual_has_many(name, uses: nil, source: name, through: nil, **options) ⇒ Object
-
#virtual_has_one(name, uses: nil, **options) ⇒ Object
Definition.
- #virtual_reflection(name) ⇒ Object
- #virtual_reflection?(name) ⇒ Boolean
-
#virtual_reflections ⇒ Object
Introspection.
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_virtual ⇒ Object
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, **) reflection = ActiveRecord::Associations::Builder::BelongsTo.build(self, name, nil, ) 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, **) 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, ) 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, **) reflection = ActiveRecord::Associations::Builder::HasOne.build(self, name, nil, ) 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_reflections ⇒ Object
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 |