mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
Merge pull request #12011 from jetthoughts/11963_fix_join_with_association_scope
Collapse where constraints to the Arel::Nodes::And node Conflicts: activerecord/CHANGELOG.md
This commit is contained in:
commit
ae297710dd
4 changed files with 25 additions and 6 deletions
|
@ -1,3 +1,11 @@
|
|||
* Fix: joins association, with defined in the scope block constraints by using several
|
||||
where constraints and at least of them is not `Arel::Nodes::Equality`,
|
||||
generates invalid SQL expression.
|
||||
|
||||
Fixes: #11963
|
||||
|
||||
*Paul Nikitochkin*
|
||||
|
||||
* Deprecate the delegation of Array bang methods for associations.
|
||||
To use them, instead first call `#to_a` on the association to access the
|
||||
array to be acted on.
|
||||
|
|
|
@ -882,14 +882,13 @@ module ActiveRecord
|
|||
end
|
||||
|
||||
def collapse_wheres(arel, wheres)
|
||||
equalities = wheres.grep(Arel::Nodes::Equality)
|
||||
|
||||
arel.where(Arel::Nodes::And.new(equalities)) unless equalities.empty?
|
||||
|
||||
(wheres - equalities).each do |where|
|
||||
predicates = wheres.map do |where|
|
||||
next where if ::Arel::Nodes::Equality === where
|
||||
where = Arel.sql(where) if String === where
|
||||
arel.where(Arel::Nodes::Grouping.new(where))
|
||||
Arel::Nodes::Grouping.new(where)
|
||||
end
|
||||
|
||||
arel.where(Arel::Nodes::And.new(predicates)) if predicates.present?
|
||||
end
|
||||
|
||||
def build_where(opts, other = [])
|
||||
|
|
|
@ -41,6 +41,11 @@ class InnerJoinAssociationTest < ActiveRecord::TestCase
|
|||
assert_no_match(/WHERE/i, sql)
|
||||
end
|
||||
|
||||
def test_join_association_conditions_support_string_and_arel_expressions
|
||||
assert_equal 0, Author.joins(:welcome_posts_with_comment).count
|
||||
assert_equal 1, Author.joins(:welcome_posts_with_comments).count
|
||||
end
|
||||
|
||||
def test_join_conditions_allow_nil_associations
|
||||
authors = Author.includes(:essays).where(:essays => {:id => nil})
|
||||
assert_equal 2, authors.count
|
||||
|
|
|
@ -29,6 +29,13 @@ class Author < ActiveRecord::Base
|
|||
has_many :thinking_posts, -> { where(:title => 'So I was thinking') }, :dependent => :delete_all, :class_name => 'Post'
|
||||
has_many :welcome_posts, -> { where(:title => 'Welcome to the weblog') }, :class_name => 'Post'
|
||||
|
||||
has_many :welcome_posts_with_comment,
|
||||
-> { where(title: 'Welcome to the weblog').where('comments_count = ?', 1) },
|
||||
class_name: 'Post'
|
||||
has_many :welcome_posts_with_comments,
|
||||
-> { where(title: 'Welcome to the weblog').where(Post.arel_table[:comments_count].gt(0)) },
|
||||
class_name: 'Post'
|
||||
|
||||
has_many :comments_desc, -> { order('comments.id DESC') }, :through => :posts, :source => :comments
|
||||
has_many :funky_comments, :through => :posts, :source => :comments
|
||||
has_many :ordered_uniq_comments, -> { distinct.order('comments.id') }, :through => :posts, :source => :comments
|
||||
|
|
Loading…
Reference in a new issue