mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #39046 from kamipo/concise_arel_ast
Improve `WhereClause#ast` to make concise Arel ast
This commit is contained in:
commit
a5469f0239
4 changed files with 12 additions and 18 deletions
|
@ -36,13 +36,15 @@ module ActiveRecord
|
||||||
arel = join_scope.arel(alias_tracker.aliases)
|
arel = join_scope.arel(alias_tracker.aliases)
|
||||||
nodes = arel.constraints.first
|
nodes = arel.constraints.first
|
||||||
|
|
||||||
others = nodes.children.extract! do |node|
|
if nodes.is_a?(Arel::Nodes::And)
|
||||||
!Arel.fetch_attribute(node) { |attr| attr.relation.name == table.name }
|
others = nodes.children.extract! do |node|
|
||||||
|
!Arel.fetch_attribute(node) { |attr| attr.relation.name == table.name }
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
joins << table.create_join(table, table.create_on(nodes), join_type)
|
joins << table.create_join(table, table.create_on(nodes), join_type)
|
||||||
|
|
||||||
unless others.empty?
|
if others && !others.empty?
|
||||||
joins.concat arel.join_sources
|
joins.concat arel.join_sources
|
||||||
append_constraints(joins.last, others)
|
append_constraints(joins.last, others)
|
||||||
end
|
end
|
||||||
|
@ -77,7 +79,8 @@ module ActiveRecord
|
||||||
join_string = table.create_and(constraints.unshift(join.left))
|
join_string = table.create_and(constraints.unshift(join.left))
|
||||||
join.left = Arel.sql(base_klass.connection.visitor.compile(join_string))
|
join.left = Arel.sql(base_klass.connection.visitor.compile(join_string))
|
||||||
else
|
else
|
||||||
join.right.expr.children.concat(constraints)
|
right = join.right
|
||||||
|
right.expr = Arel::Nodes::And.new(constraints.unshift right.expr)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -62,7 +62,8 @@ module ActiveRecord
|
||||||
end
|
end
|
||||||
|
|
||||||
def ast
|
def ast
|
||||||
Arel::Nodes::And.new(predicates_with_wrapped_sql_literals)
|
predicates = predicates_with_wrapped_sql_literals
|
||||||
|
predicates.one? ? predicates.first : Arel::Nodes::And.new(predicates)
|
||||||
end
|
end
|
||||||
|
|
||||||
def ==(other)
|
def ==(other)
|
||||||
|
|
|
@ -6,7 +6,6 @@ require "models/comment"
|
||||||
require "models/developer"
|
require "models/developer"
|
||||||
require "models/project"
|
require "models/project"
|
||||||
require "models/computer"
|
require "models/computer"
|
||||||
require "models/vehicle"
|
|
||||||
require "models/cat"
|
require "models/cat"
|
||||||
require "concurrent/atomic/cyclic_barrier"
|
require "concurrent/atomic/cyclic_barrier"
|
||||||
|
|
||||||
|
@ -499,13 +498,13 @@ class DefaultScopingTest < ActiveRecord::TestCase
|
||||||
|
|
||||||
test "a scope can remove the condition from the default scope" do
|
test "a scope can remove the condition from the default scope" do
|
||||||
scope = DeveloperCalledJamis.david2
|
scope = DeveloperCalledJamis.david2
|
||||||
assert_equal 1, scope.where_clause.ast.children.length
|
assert_instance_of Arel::Nodes::Equality, scope.where_clause.ast
|
||||||
assert_equal Developer.where(name: "David").map(&:id), scope.map(&:id)
|
assert_equal Developer.where(name: "David").map(&:id), scope.map(&:id)
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_with_abstract_class_where_clause_should_not_be_duplicated
|
def test_with_abstract_class_where_clause_should_not_be_duplicated
|
||||||
scope = Bus.all
|
scope = Lion.all
|
||||||
assert_equal scope.where_clause.ast.children.length, 1
|
assert_instance_of Arel::Nodes::Equality, scope.where_clause.ast
|
||||||
end
|
end
|
||||||
|
|
||||||
def test_sti_conditions_are_not_carried_in_default_scope
|
def test_sti_conditions_are_not_carried_in_default_scope
|
||||||
|
|
|
@ -1,9 +0,0 @@
|
||||||
# frozen_string_literal: true
|
|
||||||
|
|
||||||
class Vehicle < ActiveRecord::Base
|
|
||||||
self.abstract_class = true
|
|
||||||
default_scope -> { where("tires_count IS NOT NULL") }
|
|
||||||
end
|
|
||||||
|
|
||||||
class Bus < Vehicle
|
|
||||||
end
|
|
Loading…
Reference in a new issue