Skip to content

Commit 56fa4c3

Browse files
committed
Don't require predicate_builder to create aliased relations
Since it is possible to correctly construct the predicate_builder on the callee side if model class and aliased table object are passed, this eliminates the need for users to construct the predicate_builder and simplifies the creation of aliased relations.
1 parent cca4db3 commit 56fa4c3

File tree

6 files changed

+21
-44
lines changed

6 files changed

+21
-44
lines changed

activerecord/lib/active_record/core.rb

Lines changed: 1 addition & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -370,7 +370,7 @@ def arel_table # :nodoc:
370370
end
371371

372372
def predicate_builder # :nodoc:
373-
@predicate_builder ||= PredicateBuilder.new(table_metadata)
373+
@predicate_builder ||= PredicateBuilder.new(TableMetadata.new(self, arel_table))
374374
end
375375

376376
def type_caster # :nodoc:
@@ -415,10 +415,6 @@ def relation
415415
end
416416
end
417417

418-
def table_metadata
419-
TableMetadata.new(self, arel_table)
420-
end
421-
422418
def cached_find_by(keys, values)
423419
with_connection do |connection|
424420
statement = cached_find_by_statement(connection, keys) { |params|

activerecord/lib/active_record/reflection.rb

Lines changed: 7 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,7 @@ def scopes
198198
end
199199

200200
def join_scope(table, foreign_table, foreign_klass)
201-
predicate_builder = predicate_builder(table)
201+
predicate_builder = PredicateBuilder.new(TableMetadata.new(klass, table))
202202
scope_chain_items = join_scopes(table, predicate_builder)
203203
klass_scope = klass_join_scope(table, predicate_builder)
204204

@@ -224,15 +224,15 @@ def join_scope(table, foreign_table, foreign_klass)
224224
klass_scope
225225
end
226226

227-
def join_scopes(table, predicate_builder, klass = self.klass, record = nil) # :nodoc:
227+
def join_scopes(table, predicate_builder = nil, klass = self.klass, record = nil) # :nodoc:
228228
if scope
229229
[scope_for(build_scope(table, predicate_builder, klass), record)]
230230
else
231231
[]
232232
end
233233
end
234234

235-
def klass_join_scope(table, predicate_builder) # :nodoc:
235+
def klass_join_scope(table, predicate_builder = nil) # :nodoc:
236236
relation = build_scope(table, predicate_builder)
237237
klass.scope_for_association(relation)
238238
end
@@ -333,12 +333,8 @@ def chain
333333
collect_join_chain
334334
end
335335

336-
def build_scope(table, predicate_builder = predicate_builder(table), klass = self.klass)
337-
Relation.create(
338-
klass,
339-
table: table,
340-
predicate_builder: predicate_builder
341-
)
336+
def build_scope(table, predicate_builder = nil, klass = self.klass)
337+
Relation.create(klass, table:, predicate_builder:)
342338
end
343339

344340
def strict_loading?
@@ -357,10 +353,6 @@ def actual_source_reflection # FIXME: this is a horrible name
357353
end
358354

359355
private
360-
def predicate_builder(table)
361-
PredicateBuilder.new(TableMetadata.new(klass, table))
362-
end
363-
364356
def primary_key(klass)
365357
klass.primary_key || raise(UnknownPrimaryKey.new(klass))
366358
end
@@ -1070,7 +1062,7 @@ def scopes
10701062
source_reflection.scopes + super
10711063
end
10721064

1073-
def join_scopes(table, predicate_builder, klass = self.klass, record = nil) # :nodoc:
1065+
def join_scopes(table, predicate_builder = nil, klass = self.klass, record = nil) # :nodoc:
10741066
source_reflection.join_scopes(table, predicate_builder, klass, record) + super
10751067
end
10761068

@@ -1243,7 +1235,7 @@ def initialize(reflection, previous_reflection)
12431235
@previous_reflection = previous_reflection
12441236
end
12451237

1246-
def join_scopes(table, predicate_builder, klass = self.klass, record = nil) # :nodoc:
1238+
def join_scopes(table, predicate_builder = nil, klass = self.klass, record = nil) # :nodoc:
12471239
scopes = @previous_reflection.join_scopes(table, predicate_builder, klass, record) + super
12481240
scopes << build_scope(table, predicate_builder, klass).instance_exec(record, &source_type_scope)
12491241
end

activerecord/lib/active_record/relation.rb

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -74,7 +74,14 @@ def exec_explain(&block)
7474
alias :loaded? :loaded
7575
alias :locked? :lock_value
7676

77-
def initialize(model, table: model.arel_table, predicate_builder: model.predicate_builder, values: {})
77+
def initialize(model, table: nil, predicate_builder: nil, values: {})
78+
if table
79+
predicate_builder ||= PredicateBuilder.new(TableMetadata.new(model, table))
80+
else
81+
table = model.arel_table
82+
predicate_builder ||= model.predicate_builder
83+
end
84+
7885
@model = model
7986
@table = table
8087
@values = values

activerecord/test/cases/batches_test.rb

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -937,14 +937,8 @@ def test_find_in_batches_should_return_a_sized_enumerator
937937
test ".find_each respects table alias" do
938938
assert_queries_count(1) do
939939
table_alias = Post.arel_table.alias("omg_posts")
940-
table_metadata = ActiveRecord::TableMetadata.new(Post, table_alias)
941-
predicate_builder = ActiveRecord::PredicateBuilder.new(table_metadata)
942-
943-
posts = ActiveRecord::Relation.create(
944-
Post,
945-
table: table_alias,
946-
predicate_builder: predicate_builder
947-
)
940+
941+
posts = ActiveRecord::Relation.create(Post, table: table_alias)
948942
posts.find_each { }
949943
end
950944
end

activerecord/test/cases/collection_cache_key_test.rb

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -72,14 +72,8 @@ class CollectionCacheKeyTest < ActiveRecord::TestCase
7272

7373
test "cache_key for relation with table alias" do
7474
table_alias = Developer.arel_table.alias("omg_developers")
75-
table_metadata = ActiveRecord::TableMetadata.new(Developer, table_alias)
76-
predicate_builder = ActiveRecord::PredicateBuilder.new(table_metadata)
77-
78-
developers = ActiveRecord::Relation.create(
79-
Developer,
80-
table: table_alias,
81-
predicate_builder: predicate_builder
82-
)
75+
76+
developers = ActiveRecord::Relation.create(Developer, table: table_alias)
8377
developers = developers.where(salary: 100000).order(updated_at: :desc)
8478
last_developer_timestamp = developers.first.updated_at
8579

activerecord/test/cases/relations_test.rb

Lines changed: 1 addition & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -2458,14 +2458,8 @@ def test_find_by_with_take_memoization
24582458
private
24592459
def custom_post_relation(alias_name = "omg_posts")
24602460
table_alias = Post.arel_table.alias(alias_name)
2461-
table_metadata = ActiveRecord::TableMetadata.new(Post, table_alias)
2462-
predicate_builder = ActiveRecord::PredicateBuilder.new(table_metadata)
24632461

2464-
ActiveRecord::Relation.create(
2465-
Post,
2466-
table: table_alias,
2467-
predicate_builder: predicate_builder
2468-
)
2462+
ActiveRecord::Relation.create(Post, table: table_alias)
24692463
end
24702464
end
24712465

0 commit comments

Comments
 (0)