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
more...

Overview

:nodoc:

Defined Under Namespace

Classes: Aliases, JoinAssociation, JoinBase, JoinPart

Class Method Summary collapse

Instance Method Summary collapse

Constructor Details

#initialize(base, table, associations, join_type) ⇒ JoinDependency

Returns a new instance of JoinDependency.

[View source]

67
68
69
70
71
# File 'lib/active_record/associations/join_dependency.rb', line 67

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

Class Method Details

.make_tree(associations) ⇒ Object

[View source]

43
44
45
46
47
# File 'lib/active_record/associations/join_dependency.rb', line 43

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

.walk_tree(associations, hash) ⇒ Object

[View source]

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

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

[View source]

138
139
140
# File 'lib/active_record/associations/join_dependency.rb', line 138

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

#base_klassObject

[View source]

73
74
75
# File 'lib/active_record/associations/join_dependency.rb', line 73

def base_klass
  join_root.base_klass
end

#instantiate(result_set, &block) ⇒ Object

[View source]

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
125
126
127
128
129
130
131
132
133
134
135
136
# File 'lib/active_record/associations/join_dependency.rb', line 97

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)
  column_names = explicit_selections(column_aliases, result_set)

  if column_names.empty?
    column_types = {}
  else
    column_types = result_set.column_types
    column_types = column_types.slice(*column_names) unless column_types.empty?
    column_aliases += column_names.map! { |name| Aliases::Column.new(name, name) }
  end

  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, column_types, &block)
      construct(parent, join_root, row_hash, seen, model_cache)
    }
  end

  parents.values
end

#join_constraints(joins_to_add, alias_tracker) ⇒ Object

[View source]

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

def join_constraints(joins_to_add, 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, oj.join_type)
    else
      make_join_constraints(oj.join_root, oj.join_type)
    end
  }
end

#reflectionsObject

[View source]

77
78
79
# File 'lib/active_record/associations/join_dependency.rb', line 77

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