diff options
Diffstat (limited to 'activerecord/lib/active_record/associations')
4 files changed, 16 insertions, 5 deletions
diff --git a/activerecord/lib/active_record/associations/association_collection.rb b/activerecord/lib/active_record/associations/association_collection.rb index beebd72bba..d8b988d889 100644 --- a/activerecord/lib/active_record/associations/association_collection.rb +++ b/activerecord/lib/active_record/associations/association_collection.rb @@ -41,7 +41,7 @@ module ActiveRecord delete(@target) reset_target! end - + # Calculate sum using SQL, not Enumerable def sum(*args) if block_given? @@ -168,8 +168,10 @@ module ActiveRecord else super end - else - @reflection.klass.send(:with_scope, construct_scope) do + elsif @reflection.klass.scopes.include?(method) + @reflection.klass.scopes[method].call(self, *args) + else + with_scope(construct_scope) do if block_given? @reflection.klass.send(method, *args) { |*block_args| yield(*block_args) } else diff --git a/activerecord/lib/active_record/associations/association_proxy.rb b/activerecord/lib/active_record/associations/association_proxy.rb index adfc4610d5..421ddc15ee 100644 --- a/activerecord/lib/active_record/associations/association_proxy.rb +++ b/activerecord/lib/active_record/associations/association_proxy.rb @@ -119,6 +119,10 @@ module ActiveRecord ) end + def with_scope(*args, &block) + @reflection.klass.send :with_scope, *args, &block + end + private def method_missing(method, *args) if load_target diff --git a/activerecord/lib/active_record/associations/has_many_association.rb b/activerecord/lib/active_record/associations/has_many_association.rb index 054a8991da..eedffa052b 100644 --- a/activerecord/lib/active_record/associations/has_many_association.rb +++ b/activerecord/lib/active_record/associations/has_many_association.rb @@ -167,7 +167,10 @@ module ActiveRecord def construct_scope create_scoping = {} set_belongs_to_association_for(create_scoping) - { :find => { :conditions => @finder_sql, :readonly => false, :order => @reflection.options[:order], :limit => @reflection.options[:limit] }, :create => create_scoping } + { + :find => { :conditions => @finder_sql, :readonly => false, :order => @reflection.options[:order], :limit => @reflection.options[:limit] }, + :create => create_scoping + } end end end diff --git a/activerecord/lib/active_record/associations/has_many_through_association.rb b/activerecord/lib/active_record/associations/has_many_through_association.rb index 8c10ac641b..700a4bf89c 100644 --- a/activerecord/lib/active_record/associations/has_many_through_association.rb +++ b/activerecord/lib/active_record/associations/has_many_through_association.rb @@ -139,8 +139,10 @@ module ActiveRecord else super end + elsif @reflection.klass.scopes.include?(method) + @reflection.klass.scopes[method].call(self, *args) else - @reflection.klass.send(:with_scope, construct_scope) do + with_scope construct_scope do if block_given? @reflection.klass.send(method, *args) { |*block_args| yield(*block_args) } else |