提交 0dd2f96f 编写于 作者: D Diego Algorta 提交者: rick

Fixed bug that makes named_scopes _forgot_ current scope

上级 92a30b0c
...@@ -100,7 +100,7 @@ def named_scope(name, options = {}, &block) ...@@ -100,7 +100,7 @@ def named_scope(name, options = {}, &block)
end end
class Scope class Scope
attr_reader :proxy_scope, :proxy_options attr_reader :proxy_scope, :proxy_options, :current_scoped_methods_when_defined
NON_DELEGATE_METHODS = %w(nil? send object_id class extend find size count sum average maximum minimum paginate first last empty? any? respond_to?).to_set NON_DELEGATE_METHODS = %w(nil? send object_id class extend find size count sum average maximum minimum paginate first last empty? any? respond_to?).to_set
[].methods.each do |m| [].methods.each do |m|
unless m =~ /^__/ || NON_DELEGATE_METHODS.include?(m.to_s) unless m =~ /^__/ || NON_DELEGATE_METHODS.include?(m.to_s)
...@@ -113,6 +113,9 @@ class Scope ...@@ -113,6 +113,9 @@ class Scope
def initialize(proxy_scope, options, &block) def initialize(proxy_scope, options, &block)
[options[:extend]].flatten.each { |extension| extend extension } if options[:extend] [options[:extend]].flatten.each { |extension| extend extension } if options[:extend]
extend Module.new(&block) if block_given? extend Module.new(&block) if block_given?
unless Scope === proxy_scope
@current_scoped_methods_when_defined = proxy_scope.send(:current_scoped_methods)
end
@proxy_scope, @proxy_options = proxy_scope, options.except(:extend) @proxy_scope, @proxy_options = proxy_scope, options.except(:extend)
end end
...@@ -168,8 +171,14 @@ def method_missing(method, *args, &block) ...@@ -168,8 +171,14 @@ def method_missing(method, *args, &block)
else else
with_scope :find => proxy_options, :create => proxy_options[:conditions].is_a?(Hash) ? proxy_options[:conditions] : {} do with_scope :find => proxy_options, :create => proxy_options[:conditions].is_a?(Hash) ? proxy_options[:conditions] : {} do
method = :new if method == :build method = :new if method == :build
if current_scoped_methods_when_defined
with_scope current_scoped_methods_when_defined do
proxy_scope.send(method, *args, &block) proxy_scope.send(method, *args, &block)
end end
else
proxy_scope.send(method, *args, &block)
end
end
end end
end end
......
...@@ -142,6 +142,15 @@ def test_has_many_through_associations_have_access_to_named_scopes ...@@ -142,6 +142,15 @@ def test_has_many_through_associations_have_access_to_named_scopes
assert_equal authors(:david).comments & Comment.containing_the_letter_e, authors(:david).comments.containing_the_letter_e assert_equal authors(:david).comments & Comment.containing_the_letter_e, authors(:david).comments.containing_the_letter_e
end end
def test_named_scopes_honor_current_scopes_from_when_defined
assert !Post.ranked_by_comments.limit(5).empty?
assert !authors(:david).posts.ranked_by_comments.limit(5).empty?
assert_not_equal Post.ranked_by_comments.limit(5), authors(:david).posts.ranked_by_comments.limit(5)
assert_not_equal Post.top(5), authors(:david).posts.top(5)
assert_equal authors(:david).posts.ranked_by_comments.limit(5), authors(:david).posts.top(5)
assert_equal Post.ranked_by_comments.limit(5), Post.top(5)
end
def test_active_records_have_scope_named__all__ def test_active_records_have_scope_named__all__
assert !Topic.find(:all).empty? assert !Topic.find(:all).empty?
......
class Post < ActiveRecord::Base class Post < ActiveRecord::Base
named_scope :containing_the_letter_a, :conditions => "body LIKE '%a%'" named_scope :containing_the_letter_a, :conditions => "body LIKE '%a%'"
named_scope :ranked_by_comments, :order => "comments_count DESC"
named_scope :limit, lambda {|limit| {:limit => limit} }
named_scope :with_authors_at_address, lambda { |address| { named_scope :with_authors_at_address, lambda { |address| {
:conditions => [ 'authors.author_address_id = ?', address.id ], :conditions => [ 'authors.author_address_id = ?', address.id ],
:joins => 'JOIN authors ON authors.id = posts.author_id' :joins => 'JOIN authors ON authors.id = posts.author_id'
...@@ -68,6 +70,10 @@ def add_joins_and_select ...@@ -68,6 +70,10 @@ def add_joins_and_select
:before_remove => lambda {|owner, reader| log(:removed, :before, reader.first_name) }, :before_remove => lambda {|owner, reader| log(:removed, :before, reader.first_name) },
:after_remove => lambda {|owner, reader| log(:removed, :after, reader.first_name) } :after_remove => lambda {|owner, reader| log(:removed, :after, reader.first_name) }
def self.top(limit)
ranked_by_comments.limit(limit)
end
def self.reset_log def self.reset_log
@log = [] @log = []
end end
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册