diff options
-rw-r--r-- | activerecord/lib/active_record/associations/association_collection.rb | 3 | ||||
-rw-r--r-- | activerecord/test/cases/named_scope_test.rb | 13 | ||||
-rw-r--r-- | activerecord/test/models/comment.rb | 1 |
3 files changed, 16 insertions, 1 deletions
diff --git a/activerecord/lib/active_record/associations/association_collection.rb b/activerecord/lib/active_record/associations/association_collection.rb index 0dfd966466..d9903243ce 100644 --- a/activerecord/lib/active_record/associations/association_collection.rb +++ b/activerecord/lib/active_record/associations/association_collection.rb @@ -411,7 +411,8 @@ module ActiveRecord end elsif @reflection.klass.scopes[method] @_named_scopes_cache ||= {} - @_named_scopes_cache[method] ||= with_scope(construct_scope) { @reflection.klass.send(method, *args) } + @_named_scopes_cache[method] ||= {} + @_named_scopes_cache[method][args] ||= with_scope(construct_scope) { @reflection.klass.send(method, *args) } else with_scope(construct_scope) do if block_given? diff --git a/activerecord/test/cases/named_scope_test.rb b/activerecord/test/cases/named_scope_test.rb index 2007f5492f..91d8d2828b 100644 --- a/activerecord/test/cases/named_scope_test.rb +++ b/activerecord/test/cases/named_scope_test.rb @@ -428,6 +428,19 @@ class NamedScopeTest < ActiveRecord::TestCase assert_no_queries { post.comments.containing_the_letter_e.all } end + def test_named_scopes_with_arguments_are_cached_on_associations + post = posts(:welcome) + + one = post.comments.limit_by(1).all + assert_equal 1, one.size + + two = post.comments.limit_by(2).all + assert_equal 2, two.size + + assert_no_queries { post.comments.limit_by(1).all } + assert_no_queries { post.comments.limit_by(2).all } + end + def test_named_scopes_are_reset_on_association_reload post = posts(:welcome) diff --git a/activerecord/test/models/comment.rb b/activerecord/test/models/comment.rb index a8a99f6dce..9f6e2d3b71 100644 --- a/activerecord/test/models/comment.rb +++ b/activerecord/test/models/comment.rb @@ -1,4 +1,5 @@ class Comment < ActiveRecord::Base + scope :limit_by, lambda {|l| limit(l) } scope :containing_the_letter_e, :conditions => "comments.body LIKE '%e%'" scope :for_first_post, :conditions => { :post_id => 1 } scope :for_first_author, |