method

expand_from_hash

Importance_0
v5.2.3 - Show latest stable - 0 notes - Class: ActiveRecord::PredicateBuilder
expand_from_hash(attributes) protected

No documentation

This method has no description. You can help the Ruby on Rails community by adding new notes.

Hide source
# File activerecord/lib/active_record/relation/predicate_builder.rb, line 68
      def expand_from_hash(attributes)
        return ["1=0"] if attributes.empty?

        attributes.flat_map do |key, value|
          if value.is_a?(Hash) && !table.has_column?(key)
            associated_predicate_builder(key).expand_from_hash(value)
          elsif table.associated_with?(key)
            # Find the foreign key when using queries such as:
            # Post.where(author: author)
            #
            # For polymorphic relationships, find the foreign key and type:
            # PriceEstimate.where(estimate_of: treasure)
            associated_table = table.associated_table(key)
            if associated_table.polymorphic_association?
              case value.is_a?(Array) ? value.first : value
              when Base, Relation
                value = [value] unless value.is_a?(Array)
                klass = PolymorphicArrayValue
              end
            end

            klass ||= AssociationQueryValue
            queries = klass.new(associated_table, value).queries.map do |query|
              expand_from_hash(query).reduce(&:and)
            end
            queries.reduce(&:or)
          elsif table.aggregated_with?(key)
            mapping = table.reflect_on_aggregation(key).mapping
            values = value.nil? ? [nil] : Array.wrap(value)
            if mapping.length == 1 || values.empty?
              column_name, aggr_attr = mapping.first
              values = values.map do |object|
                object.respond_to?(aggr_attr) ? object.public_send(aggr_attr) : object
              end
              build(table.arel_attribute(column_name), values)
            else
              queries = values.map do |object|
                mapping.map do |field_attr, aggregate_attr|
                  build(table.arel_attribute(field_attr), object.try!(aggregate_attr))
                end.reduce(&:and)
              end
              queries.reduce(&:or)
            end
          else
            build(table.arel_attribute(key), value)
          end
        end
      end
Register or log in to add new notes.