Class: ActiveRecord::PredicateBuilder

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

Instance Method Summary collapse

Constructor Details

#initialize(engine) ⇒ PredicateBuilder

Returns a new instance of PredicateBuilder.



4
5
6
# File 'lib/active_record/relation/predicate_builder.rb', line 4

def initialize(engine)
  @engine = engine
end

Instance Method Details

#build_from_hash(attributes, default_table) ⇒ Object



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
# File 'lib/active_record/relation/predicate_builder.rb', line 8

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

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

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

      attribute = table[column] || Arel::Attribute.new(table, column)

      case value
      when Array, ActiveRecord::Associations::AssociationCollection, ActiveRecord::Relation
        values = value.to_a.map { |x|
          x.is_a?(ActiveRecord::Base) ? x.id : x
        }
        attribute.in(values)
      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