Class: ActiveRecord::PredicateBuilder::PolymorphicArrayValue
Do not use. This class is for internal use only.
| Relationships & Source Files | |
| Inherits: | Object |
| Defined in: | activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb |
Class Method Summary
Instance Attribute Summary
- #reflection readonly private
- #values readonly private
Instance Method Summary
- #queries
- #convert_to_id(value, route) private
- #reference_key_name private
- #route_for(value) private
- #route_groups private
Constructor Details
.new(reflection, values, origin_model) ⇒ PolymorphicArrayValue
# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 6
def initialize(reflection, values, origin_model) @reflection = reflection @values = values @origin_model = origin_model end
Instance Attribute Details
#reflection (readonly, private)
[ GitHub ]# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 21
attr_reader :reflection, :values
#values (readonly, private)
[ GitHub ]# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 21
attr_reader :reflection, :values
Instance Method Details
#convert_to_id(value, route) (private)
[ GitHub ]# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 57
def convert_to_id(value, route) if value.is_a?(Base) route.destination_key.value_of(value) elsif value.is_a?(Relation) if route.destination_key.composite? value.pluck(route.destination_key.name) else value.select(route.destination_key.name) end else value end end
#queries
[ GitHub ]# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 12
def queries return [ reference_key_name => values ] if values.empty? route_groups.filter_map do |_key, (fixed_values, origin_key, ids)| fixed_values.merge(origin_key => ids) unless ids.empty? end end
#reference_key_name (private)
[ GitHub ]# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 46
def reference_key_name @reference_key_name ||= reflection.association_route(origin_class: @origin_model).reference_origin_key.name end
#route_for(value) (private)
[ GitHub ]# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 50
def route_for(value) if value.is_a?(Base) || value.is_a?(Relation) destination_class = value.is_a?(Relation) ? value.model : value.class reflection.association_route(origin_class: @origin_model, destination_class: destination_class) end end
#route_groups (private)
[ GitHub ]# File 'activerecord/lib/active_record/relation/predicate_builder/polymorphic_array_value.rb', line 23
def route_groups values.each_with_object({}) do |value, groups| if route = route_for(value) fixed_values = route.origin_fixed_values origin_key = route.origin_key.name else # Bare ids carry no target class, so match them directly against the foreign # key, without a fixed value for the polymorphic type. fixed_values = {} origin_key = reference_key_name end key = [fixed_values, origin_key] group = groups[key] ||= [fixed_values, origin_key, []] ids = convert_to_id(value, route) if value.is_a?(Relation) && route.destination_key.composite? group.last.concat(ids) else group.last << ids end end end