diff options
author | pinglamb <pinglambs@gmail.com> | 2015-03-22 16:15:41 +0800 |
---|---|---|
committer | pinglamb <pinglambs@gmail.com> | 2015-03-22 16:25:23 +0800 |
commit | ba057a5ebbf93283fc7d3f3f3ffdbae2f8c76fb7 (patch) | |
tree | 27ee20c85cfbf85c8bc9b2e9dfc9bd71ee7bca91 /activerecord | |
parent | fdf55619652fc5200d000241c545323c46bd6b79 (diff) | |
download | rails-ba057a5ebbf93283fc7d3f3f3ffdbae2f8c76fb7.tar.gz rails-ba057a5ebbf93283fc7d3f3f3ffdbae2f8c76fb7.tar.bz2 rails-ba057a5ebbf93283fc7d3f3f3ffdbae2f8c76fb7.zip |
Fix referencing wrong aliases while joining tables of has many through
association
While joining table of has_many :through association, ActiveRecord will
use the actual table name instead of through-join alias. It results with
a wrong SQL and exception is raised. This only happens when calculation
methods like #count is called.
This issue is affecting Rails 4.1.x and 4.2.x as well.
Diffstat (limited to 'activerecord')
-rw-r--r-- | activerecord/CHANGELOG.md | 7 | ||||
-rw-r--r-- | activerecord/lib/active_record/relation/finder_methods.rb | 2 | ||||
-rw-r--r-- | activerecord/test/cases/calculations_test.rb | 11 |
3 files changed, 19 insertions, 1 deletions
diff --git a/activerecord/CHANGELOG.md b/activerecord/CHANGELOG.md index 8b35839a50..b5ab5587f6 100644 --- a/activerecord/CHANGELOG.md +++ b/activerecord/CHANGELOG.md @@ -1,3 +1,10 @@ +* Fix referencing wrong table aliases while joining tables of has many through association + (only when calling calculation methods). + + Fixes #19276 + + *pinglamb* + * Reuse the `CollectionAssociation#reader` cache when the foreign key is available prior to save. diff --git a/activerecord/lib/active_record/relation/finder_methods.rb b/activerecord/lib/active_record/relation/finder_methods.rb index 7bd091b66c..3f747a20b3 100644 --- a/activerecord/lib/active_record/relation/finder_methods.rb +++ b/activerecord/lib/active_record/relation/finder_methods.rb @@ -378,7 +378,7 @@ module ActiveRecord def construct_relation_for_association_calculations from = arel.froms.first if Arel::Table === from - apply_join_dependency(self, construct_join_dependency) + apply_join_dependency(self, construct_join_dependency(joins_values)) else # FIXME: as far as I can tell, `from` will always be an Arel::Table. # There are no tests that test this branch, but presumably it's diff --git a/activerecord/test/cases/calculations_test.rb b/activerecord/test/cases/calculations_test.rb index f0393aa6b1..8fc996ee74 100644 --- a/activerecord/test/cases/calculations_test.rb +++ b/activerecord/test/cases/calculations_test.rb @@ -11,6 +11,10 @@ require 'models/minivan' require 'models/speedometer' require 'models/ship_part' require 'models/treasure' +require 'models/developer' +require 'models/comment' +require 'models/rating' +require 'models/post' class NumericData < ActiveRecord::Base self.table_name = 'numeric_data' @@ -636,4 +640,11 @@ class CalculationsTest < ActiveRecord::TestCase Client.update_all(client_of: nil) assert_equal({ nil => Client.count }, Client.group(:firm).count) end + + def test_should_reference_correct_aliases_while_joining_tables_of_has_many_through_association + assert_nothing_raised ActiveRecord::StatementInvalid do + developer = Developer.create!(name: 'developer') + developer.ratings.includes(comment: :post).where(posts: { id: 1 }).count + end + end end |