Class: ActiveRecord::Associations::JoinDependency

Inherits:
Object
  • Object
show all
Defined in:
lib/active_record/associations/join_dependency.rb,
lib/active_record/associations/join_dependency/join_base.rb,
lib/active_record/associations/join_dependency/join_part.rb,
lib/active_record/associations/join_dependency/join_association.rb

Overview

:nodoc:

Defined Under Namespace

Classes: Aliases, JoinAssociation, JoinBase, JoinPart

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base, table, associations) ⇒ JoinDependency

Returns a new instance of JoinDependency.



70
71
72
73
# File 'lib/active_record/associations/join_dependency.rb', line 70

def initialize(base, table, associations)
  tree = self.class.make_tree associations
  @join_root = JoinBase.new(base, table, build(tree, base))
end

Class Method Details

.make_tree(associations) ⇒ Object



46
47
48
49
50
# File 'lib/active_record/associations/join_dependency.rb', line 46

def self.make_tree(associations)
  hash = {}
  walk_tree associations, hash
  hash
end

.walk_tree(associations, hash) ⇒ Object



52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
# File 'lib/active_record/associations/join_dependency.rb', line 52

def self.walk_tree(associations, hash)
  case associations
  when Symbol, String
    hash[associations.to_sym] ||= {}
  when Array
    associations.each do |assoc|
      walk_tree assoc, hash
    end
  when Hash
    associations.each do |k, v|
      cache = hash[k] ||= {}
      walk_tree v, cache
    end
  else
    raise ConfigurationError, associations.inspect
  end
end

Instance Method Details

#apply_column_aliases(relation) ⇒ Object



126
127
128
# File 'lib/active_record/associations/join_dependency.rb', line 126

def apply_column_aliases(relation)
  relation._select!(-> { aliases.columns })
end

#instantiate(result_set, &block) ⇒ Object



95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
# File 'lib/active_record/associations/join_dependency.rb', line 95

def instantiate(result_set, &block)
  primary_key = aliases.column_alias(join_root, join_root.primary_key)

  seen = Hash.new { |i, object_id|
    i[object_id] = Hash.new { |j, child_class|
      j[child_class] = {}
    }
  }

  model_cache = Hash.new { |h, klass| h[klass] = {} }
  parents = model_cache[join_root]
  column_aliases = aliases.column_aliases join_root

  message_bus = ActiveSupport::Notifications.instrumenter

  payload = {
    record_count: result_set.length,
    class_name: join_root.base_klass.name
  }

  message_bus.instrument("instantiation.active_record", payload) do
    result_set.each { |row_hash|
      parent_key = primary_key ? row_hash[primary_key] : row_hash
      parent = parents[parent_key] ||= join_root.instantiate(row_hash, column_aliases, &block)
      construct(parent, join_root, row_hash, result_set, seen, model_cache, aliases)
    }
  end

  parents.values
end

#join_constraints(joins_to_add, join_type, alias_tracker) ⇒ Object



79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
# File 'lib/active_record/associations/join_dependency.rb', line 79

def join_constraints(joins_to_add, join_type, alias_tracker)
  @alias_tracker = alias_tracker

  construct_tables!(join_root)
  joins = make_join_constraints(join_root, join_type)

  joins.concat joins_to_add.flat_map { |oj|
    construct_tables!(oj.join_root)
    if join_root.match? oj.join_root
      walk join_root, oj.join_root
    else
      make_join_constraints(oj.join_root, join_type)
    end
  }
end

#reflectionsObject



75
76
77
# File 'lib/active_record/associations/join_dependency.rb', line 75

def reflections
  join_root.drop(1).map!(&:reflection)
end