Class: ActiveRecord::PredicateBuilder

Inherits:
Object
  • Object
show all
Defined in:
activerecord/lib/active_record/relation/predicate_builder.rb

Overview

:nodoc:

Class Method Summary collapse

Class Method Details

.build_from_hash(engine, attributes, default_table) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
# File 'activerecord/lib/active_record/relation/predicate_builder.rb', line 3

def self.build_from_hash(engine, attributes, default_table)
  predicates = attributes.map do |column, value|
    table = default_table

    if value.is_a?(Hash)
      table = Arel::Table.new(column, engine)
      build_from_hash(engine, value, table)
    else
      column = column.to_s

      if column.include?('.')
        table_name, column = column.split('.', 2)
        table = Arel::Table.new(table_name, engine)
      end

      attribute = table[column.to_sym]

      case value
      when ActiveRecord::Relation
        value = value.select(value.klass.arel_table[value.klass.primary_key]) if value.select_values.empty?
        attribute.in(value.arel.ast)
      when Array, ActiveRecord::Associations::CollectionProxy
        values = value.to_a.map { |x|
          x.is_a?(ActiveRecord::Base) ? x.id : x
        }

        if values.include?(nil)
          values = values.compact
          if values.empty?
            attribute.eq nil
          else
            attribute.in(values.compact).or attribute.eq(nil)
          end
        else
          attribute.in(values)
        end

      when Range, Arel::Relation
        attribute.in(value)
      when ActiveRecord::Base
        attribute.eq(value.id)
      when Class
        # FIXME: I think we need to deprecate this behavior
        attribute.eq(value.name)
      else
        attribute.eq(value)
      end
    end
  end

  predicates.flatten
end