aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorAndrew White <andyw@pixeltrix.co.uk>2012-06-01 03:03:50 +0100
committerAndrew White <andyw@pixeltrix.co.uk>2012-06-01 03:03:50 +0100
commit7056079761eba049bbc6108946a1626fe169dbdf (patch)
tree6f55bdc0521a3dd521cb2776da07d927236203cf /activerecord
parent4df968071436a4585c8e4694efecfabb02f1a806 (diff)
downloadrails-7056079761eba049bbc6108946a1626fe169dbdf.tar.gz
rails-7056079761eba049bbc6108946a1626fe169dbdf.tar.bz2
rails-7056079761eba049bbc6108946a1626fe169dbdf.zip
Restore behavior of Active Record 3.2.3 scopes
A series of commits relating to preloading and scopes caused a regression. Cloning the relation calls initialize_copy which resets a number of instance variables to nil. Without this the scope thinks that it is already loaded when it is called again. Reverts the following commits: 13f1401a6cf0266a3b0a91b173f976db2d4e50f3 8491740ca5361ba9df20e1c8b906c709f5bfbc12 dffbb521a0d00c8673a3ad6e0e8ff526f32daf4e Fixes #6575, #6576 & #6577
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/associations/preloader/association.rb5
-rw-r--r--activerecord/lib/active_record/scoping/named.rb4
-rw-r--r--activerecord/test/cases/associations/eager_test.rb24
-rw-r--r--activerecord/test/models/comment.rb2
4 files changed, 4 insertions, 31 deletions
diff --git a/activerecord/lib/active_record/associations/preloader/association.rb b/activerecord/lib/active_record/associations/preloader/association.rb
index ab50e43ea0..779f8164cc 100644
--- a/activerecord/lib/active_record/associations/preloader/association.rb
+++ b/activerecord/lib/active_record/associations/preloader/association.rb
@@ -77,7 +77,7 @@ module ActiveRecord
# Some databases impose a limit on the number of ids in a list (in Oracle it's 1000)
# Make several smaller queries if necessary or make one query if the adapter supports it
sliced = owner_keys.each_slice(model.connection.in_clause_length || owner_keys.size)
- records = sliced.map { |slice| records_for(slice).to_a }.flatten
+ records = sliced.map { |slice| records_for(slice) }.flatten
end
# Each record may have multiple owners, and vice-versa
@@ -93,8 +93,7 @@ module ActiveRecord
end
def build_scope
- scope = klass.unscoped
- scope.default_scoped = true
+ scope = klass.scoped
scope = scope.where(process_conditions(options[:conditions]))
scope = scope.where(process_conditions(preload_options[:conditions]))
diff --git a/activerecord/lib/active_record/scoping/named.rb b/activerecord/lib/active_record/scoping/named.rb
index d6b0265fb3..9c50baa647 100644
--- a/activerecord/lib/active_record/scoping/named.rb
+++ b/activerecord/lib/active_record/scoping/named.rb
@@ -34,7 +34,7 @@ module ActiveRecord
if current_scope
current_scope.clone
else
- scope = relation
+ scope = relation.clone
scope.default_scoped = true
scope
end
@@ -48,7 +48,7 @@ module ActiveRecord
if current_scope
current_scope.scope_for_create
else
- scope = relation
+ scope = relation.clone
scope.default_scoped = true
scope.scope_for_create
end
diff --git a/activerecord/test/cases/associations/eager_test.rb b/activerecord/test/cases/associations/eager_test.rb
index d7af07f9c7..1dc71ac4cc 100644
--- a/activerecord/test/cases/associations/eager_test.rb
+++ b/activerecord/test/cases/associations/eager_test.rb
@@ -1095,28 +1095,4 @@ class EagerAssociationTest < ActiveRecord::TestCase
Post.includes(:comments).order(nil).where(:comments => {:body => "Thank you for the welcome"}).first
end
end
-
- def test_deep_including_through_habtm
- posts = Post.find(:all, :include => {:categories => :categorizations}, :order => "posts.id, categories.id")
- assert_no_queries { assert_equal 2, posts[0].categories[0].categorizations.length }
- assert_no_queries { assert_equal 1, posts[0].categories[1].categorizations.length }
- assert_no_queries { assert_equal 2, posts[1].categories[0].categorizations.length }
- end
-
- test "scoping with a circular preload" do
- assert_equal Comment.find(1), Comment.preload(:post => :comments).scoping { Comment.find(1) }
- end
-
- test "circular preload does not modify unscoped" do
- expected = FirstPost.unscoped.find(2)
- FirstPost.preload(:comments => :first_post).find(1)
- assert_equal expected, FirstPost.unscoped.find(2)
- end
-
- test "preload ignores the scoping" do
- assert_equal(
- Comment.find(1).post,
- Post.where('1 = 0').scoping { Comment.preload(:post).find(1).post }
- )
- end
end
diff --git a/activerecord/test/models/comment.rb b/activerecord/test/models/comment.rb
index bca937a299..88b139d931 100644
--- a/activerecord/test/models/comment.rb
+++ b/activerecord/test/models/comment.rb
@@ -11,8 +11,6 @@ class Comment < ActiveRecord::Base
belongs_to :post, :counter_cache => true
has_many :ratings
- belongs_to :first_post, :foreign_key => :post_id
-
has_many :children, :class_name => 'Comment', :foreign_key => :parent_id
belongs_to :parent, :class_name => 'Comment', :counter_cache => :children_count