diff options
Diffstat (limited to 'activerecord')
| -rw-r--r-- | activerecord/CHANGELOG.md | 8 | ||||
| -rw-r--r-- | activerecord/lib/active_record/relation/query_methods.rb | 11 | ||||
| -rw-r--r-- | activerecord/test/cases/associations/inner_join_association_test.rb | 5 | ||||
| -rw-r--r-- | activerecord/test/models/author.rb | 7 | 
4 files changed, 25 insertions, 6 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 0cf50c512e..a2e2fed75f 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -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. diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb index 9916c597ee..9fcb6db726 100644 --- a/activerecord/lib/active_record/relation/query_methods.rb +++ b/activerecord/lib/active_record/relation/query_methods.rb @@ -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 = []) diff --git a/activerecord/test/cases/associations/inner_join_association_test.rb b/activerecord/test/cases/associations/inner_join_association_test.rb index de47a576c6..9fe5ff50d9 100644 --- a/activerecord/test/cases/associations/inner_join_association_test.rb +++ b/activerecord/test/cases/associations/inner_join_association_test.rb @@ -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 diff --git a/activerecord/test/models/author.rb b/activerecord/test/models/author.rb index 7dad8041f3..794d1af43d 100644 --- a/activerecord/test/models/author.rb +++ b/activerecord/test/models/author.rb @@ -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  | 
