aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord/lib/active_record/associations/preloader.rb
diff options
context:
space:
mode:
authorAaron Patterson <aaron.patterson@gmail.com>2013-09-24 11:28:28 -0700
committerAaron Patterson <aaron.patterson@gmail.com>2013-09-24 11:28:28 -0700
commitb93d09dbc59b3b85e7208cd57c92be9d86fd51df (patch)
tree160715adb7dcdb53021c5f62e4529042b6b4dc14 /activerecord/lib/active_record/associations/preloader.rb
parentbb9554ad62a3f37738ee7ad99dbbb9a37784c343 (diff)
downloadrails-b93d09dbc59b3b85e7208cd57c92be9d86fd51df.tar.gz
rails-b93d09dbc59b3b85e7208cd57c92be9d86fd51df.tar.bz2
rails-b93d09dbc59b3b85e7208cd57c92be9d86fd51df.zip
push preloaded test up to the factory method so we can eliminate
conditionals from the individual preloaded classes
Diffstat (limited to 'activerecord/lib/active_record/associations/preloader.rb')
-rw-r--r--activerecord/lib/active_record/associations/preloader.rb19
1 files changed, 17 insertions, 2 deletions
diff --git a/activerecord/lib/active_record/associations/preloader.rb b/activerecord/lib/active_record/associations/preloader.rb
index b99ae35809..8a975468f2 100644
--- a/activerecord/lib/active_record/associations/preloader.rb
+++ b/activerecord/lib/active_record/associations/preloader.rb
@@ -133,7 +133,7 @@ module ActiveRecord
def preloaders_for_one(association, records, scope)
grouped_records(association, records).flat_map do |reflection, klasses|
klasses.map do |rhs_klass, rs|
- loader = preloader_for(reflection).new(rhs_klass, rs, reflection, scope)
+ loader = preloader_for(reflection, rs).new(rhs_klass, rs, reflection, scope)
loader.run self
loader
end
@@ -173,7 +173,22 @@ module ActiveRecord
end
end
- def preloader_for(reflection)
+ class NullPreloader
+ attr_reader :owners
+
+ def initialize(klass, owners, reflection, preload_scope)
+ @owners = owners
+ end
+
+ def run(preloader); end
+ def loaded?; false; end
+ end
+
+ def preloader_for(reflection, owners)
+ if owners.first.association(reflection.name).loaded?
+ return NullPreloader
+ end
+
case reflection.macro
when :has_many
reflection.options[:through] ? HasManyThrough : HasMany