Permalink
Browse files

`pluck` should use `records` (`load_target`) when `loaded?` is true

  • Loading branch information...
kamipo committed Jul 28, 2016
1 parent 5b469da commit 3a8a9979acab6a6f4c6d759521c052fe2ac46d2b
@@ -28,7 +28,6 @@ module Associations
# is computed directly through SQL and does not trigger by itself the
# instantiation of the actual post records.
class CollectionProxy < Relation
delegate(*(ActiveRecord::Calculations.public_instance_methods - [:count]), to: :scope)
delegate :exists?, :update_all, :arel, to: :scope
def initialize(klass, association) #:nodoc:
@@ -738,6 +737,14 @@ def count(column_name = nil, &block)
@association.count(column_name, &block)
end
def calculate(operation, column_name)
null_scope? ? scope.calculate(operation, column_name) : super
end
def pluck(*column_names)
null_scope? ? scope.pluck(*column_names) : super
end
# Returns the size of the collection. If the collection hasn't been loaded,
# it executes a <tt>SELECT COUNT(*)</tt> query. Else it calls <tt>collection.size</tt>.
#
@@ -1073,6 +1080,10 @@ def reset
private
def null_scope?
@association.null_scope?
end
def exec_queries
load_target
end
@@ -160,7 +160,7 @@ def calculate(operation, column_name)
#
def pluck(*column_names)
if loaded? && (column_names.map(&:to_s) - @klass.attribute_names - @klass.attribute_aliases.keys).empty?
return @records.pluck(*column_names)
return records.pluck(*column_names)
end
if has_include?(column_names.first)
@@ -258,6 +258,13 @@ def test_scoped_allows_conditions
assert_no_queries { david.posts.first! }
end
def test_pluck_uses_loaded_target
david = authors(:david)
assert_equal david.posts.pluck(:title), david.posts.load.pluck(:title)
assert david.posts.loaded?
assert_no_queries { david.posts.pluck(:title) }
end
def test_reset_unloads_target
david = authors(:david)
david.posts.reload

0 comments on commit 3a8a997

Please sign in to comment.