Skip to content

Commit

Permalink
defining a named_scope which overwrites an existing method is now all…
Browse files Browse the repository at this point in the history
…owed

we just log a warning.

This was motivated by the fact that :open is defined on all classes
as such the named_scope "open" can never be used, without hacking
ActiveRecord with an "undef_method"
  • Loading branch information
matthewrudy committed Mar 2, 2010
1 parent 11db694 commit 3a29b8f
Show file tree
Hide file tree
Showing 2 changed files with 16 additions and 3 deletions.
2 changes: 1 addition & 1 deletion activerecord/lib/active_record/named_scope.rb
Expand Up @@ -101,7 +101,7 @@ def scope(name, options = {}, &block)
name = name.to_sym

if !scopes[name] && respond_to?(name, true)
raise ArgumentError, "Cannot define scope :#{name} because #{self.name}.#{name} method already exists."
logger.warn "Creating scope :#{name}. Overwriting existing method #{self.name}.#{name}."
end

scopes[name] = lambda do |parent_scope, *args|
Expand Down
17 changes: 15 additions & 2 deletions activerecord/test/cases/named_scope_test.rb
Expand Up @@ -371,8 +371,21 @@ def test_table_names_for_chaining_scopes_with_and_without_table_name_included
end

def test_named_scopes_with_reserved_names
[:where, :with_scope].each do |protected_method|
assert_raises(ArgumentError) { Topic.scope protected_method }
class << Topic
def public_method; end
public :public_method

def protected_method; end
protected :protected_method

def private_method; end
private :private_method
end

[:public_method, :protected_method, :private_method].each do |reserved_method|
assert Topic.respond_to?(reserved_method, true)
ActiveRecord::Base.logger.expects(:warn)
Topic.scope(reserved_method)
end
end

Expand Down

0 comments on commit 3a29b8f

Please sign in to comment.