Class: ActiveRecord::Relation::HashMerger

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

Overview

:nodoc:

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(relation, hash) ⇒ HashMerger

Returns a new instance of HashMerger.



8
9
10
11
12
13
# File 'lib/active_record/relation/merger.rb', line 8

def initialize(relation, hash)
  hash.assert_valid_keys(*Relation::VALUE_METHODS)

  @relation = relation
  @hash     = hash
end

Instance Attribute Details

#hashObject (readonly)

Returns the value of attribute hash.



6
7
8
# File 'lib/active_record/relation/merger.rb', line 6

def hash
  @hash
end

#relationObject (readonly)

Returns the value of attribute relation.



6
7
8
# File 'lib/active_record/relation/merger.rb', line 6

def relation
  @relation
end

Instance Method Details

#mergeObject

:nodoc:



15
16
17
# File 'lib/active_record/relation/merger.rb', line 15

def merge #:nodoc:
  Merger.new(relation, other).merge
end

#otherObject

Applying values to a relation has some side effects. E.g. interpolation might take place for where values. So we should build a relation to merge in rather than directly merging the values.



23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
# File 'lib/active_record/relation/merger.rb', line 23

def other
  other = Relation.create(relation.klass, relation.table, relation.predicate_builder)
  hash.each { |k, v|
    if k == :joins
      if Hash === v
        other.joins!(v)
      else
        other.joins!(*v)
      end
    elsif k == :select
      other._select!(v)
    else
      other.send("#{k}!", v)
    end
  }
  other
end