diff options
author | Prem Sichanugrist <s@sikachu.com> | 2011-07-17 18:53:15 -0400 |
---|---|---|
committer | Prem Sichanugrist <s@sikachu.com> | 2011-07-17 18:53:15 -0400 |
commit | 1ccca1b9cb4c360b6d9784663da542df34ed3773 (patch) | |
tree | c07c83c836f0e4c55274cec2275c2ec3fe56281b | |
parent | 6e6994994d9a8edea33720f0da32b04f9a0efa2f (diff) | |
download | rails-1ccca1b9cb4c360b6d9784663da542df34ed3773.tar.gz rails-1ccca1b9cb4c360b6d9784663da542df34ed3773.tar.bz2 rails-1ccca1b9cb4c360b6d9784663da542df34ed3773.zip |
Refactor the code a bit to reduce the duplication
-rw-r--r-- | activerecord/lib/active_record/base.rb | 25 |
1 files changed, 8 insertions, 17 deletions
diff --git a/activerecord/lib/active_record/base.rb b/activerecord/lib/active_record/base.rb index 5808950715..25074c2d4f 100644 --- a/activerecord/lib/active_record/base.rb +++ b/activerecord/lib/active_record/base.rb @@ -1052,7 +1052,7 @@ module ActiveRecord #:nodoc: # Each dynamic finder using <tt>scoped_by_*</tt> is also defined in the class after it # is first invoked, so that future attempts to use it do not run through method_missing. def method_missing(method_id, *arguments, &block) - if match = DynamicFinderMatch.match(method_id) + if match = (DynamicFinderMatch.match(method_id) || DynamicScopeMatch.match(method_id)) attribute_names = match.attribute_names super unless all_attributes_exists?(attribute_names) if arguments.size < attribute_names.size @@ -1060,22 +1060,7 @@ module ActiveRecord #:nodoc: backtrace = [method_trace] + caller raise ArgumentError, "wrong number of arguments (#{arguments.size} for #{attribute_names.size})", backtrace end - if match.finder? - options = arguments.extract_options! - relation = options.any? ? scoped(options) : scoped - relation.send :find_by_attributes, match, attribute_names, *arguments, &block - elsif match.instantiator? - scoped.send :find_or_instantiator_by_attributes, match, attribute_names, *arguments, &block - end - elsif match = DynamicScopeMatch.match(method_id) - attribute_names = match.attribute_names - super unless all_attributes_exists?(attribute_names) - if arguments.size < attribute_names.size - method_trace = "#{__FILE__}:#{__LINE__}:in `#{method_id}'" - backtrace = [method_trace] + caller - raise ArgumentError, "wrong number of arguments (#{arguments.size} for #{attribute_names.size})", backtrace - end - if match.scope? + if match.respond_to?(:scope?) && match.scope? self.class_eval <<-METHOD, __FILE__, __LINE__ + 1 def self.#{method_id}(*args) # def self.scoped_by_user_name_and_password(*args) attributes = Hash[[:#{attribute_names.join(',:')}].zip(args)] # attributes = Hash[[:user_name, :password].zip(args)] @@ -1084,6 +1069,12 @@ module ActiveRecord #:nodoc: end # end METHOD send(method_id, *arguments) + elsif match.finder? + options = arguments.extract_options! + relation = options.any? ? scoped(options) : scoped + relation.send :find_by_attributes, match, attribute_names, *arguments, &block + elsif match.instantiator? + scoped.send :find_or_instantiator_by_attributes, match, attribute_names, *arguments, &block end else super |