Class: ActiveRecord::Relation::Merger

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

Overview

:nodoc:

Constant Summary collapse

NORMAL_VALUES =
Relation::VALUE_METHODS -
Relation::CLAUSE_METHODS -
[:includes, :preload, :joins, :left_outer_joins, :order, :reverse_order, :lock, :create_with, :reordering]

Instance Attribute Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(relation, other) ⇒ Merger


51
52
53
54
55
# File 'activerecord/lib/active_record/relation/merger.rb', line 51

def initialize(relation, other)
  @relation = relation
  @values   = other.values
  @other    = other
end

Instance Attribute Details

#otherObject (readonly)

Returns the value of attribute other


49
50
51
# File 'activerecord/lib/active_record/relation/merger.rb', line 49

def other
  @other
end

#relationObject (readonly)

Returns the value of attribute relation


49
50
51
# File 'activerecord/lib/active_record/relation/merger.rb', line 49

def relation
  @relation
end

#valuesObject (readonly)

Returns the value of attribute values


49
50
51
# File 'activerecord/lib/active_record/relation/merger.rb', line 49

def values
  @values
end

Instance Method Details

#mergeObject


65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
# File 'activerecord/lib/active_record/relation/merger.rb', line 65

def merge
  normal_values.each do |name|
    value = values[name]
    # The unless clause is here mostly for performance reasons (since the `send` call might be moderately
    # expensive), most of the time the value is going to be `nil` or `.blank?`, the only catch is that
    # `false.blank?` returns `true`, so there needs to be an extra check so that explicit `false` values
    # don't fall through the cracks.
    unless value.nil? || (value.blank? && false != value)
      if name == :select
        relation._select!(*value)
      else
        relation.send("#{name}!", *value)
      end
    end
  end

  merge_multi_values
  merge_single_values
  merge_clauses
  merge_preloads
  merge_joins
  merge_outer_joins

  relation
end

#normal_valuesObject


61
62
63
# File 'activerecord/lib/active_record/relation/merger.rb', line 61

def normal_values
  NORMAL_VALUES
end