Permalink
Browse files

Remove HasManyAssociationStrategy and move the logic to ActiveRecord:…

…:Reflection::ThroughReflection.
  • Loading branch information...
lifo committed Oct 4, 2008
1 parent 25ca21a commit 4918e6de989a80bb2ae92183f1b4eb98c15b487f
Showing with 21 additions and 27 deletions.
  1. +4 −26 activerecord/lib/active_record/association_preload.rb
  2. +17 −1 activerecord/lib/active_record/reflection.rb
@@ -4,28 +4,6 @@ def self.included(base)
base.extend(ClassMethods)
end
- class HasManyAssociationStrategy
- def initialize(through_reflection)
- @through_reflection = through_reflection
- end
-
- def primary_key
- if @through_reflection && @through_reflection.macro == :belongs_to
- @through_reflection.klass.primary_key
- else
- @through_reflection.primary_key_name
- end
- end
-
- def primary_key_name
- if @through_reflection && @through_reflection.macro == :belongs_to
- @through_reflection.primary_key_name
- else
- nil
- end
- end
- end
-
module ClassMethods
# Loads the named associations for the activerecord record (or records) given
@@ -153,9 +131,9 @@ def preload_has_one_association(records, reflection, preload_options={})
def preload_has_many_association(records, reflection, preload_options={})
options = reflection.options
- through_reflection = reflections[options[:through]]
- strat = HasManyAssociationStrategy.new(through_reflection)
- id_to_record_map, ids = construct_id_map(records, strat.primary_key_name)
+
+ primary_key_name = reflection.through_reflection_primary_key_name
+ id_to_record_map, ids = construct_id_map(records, primary_key_name)
records.each {|record| record.send(reflection.name).loaded}
if options[:through]
@@ -165,7 +143,7 @@ def preload_has_many_association(records, reflection, preload_options={})
source = reflection.source_reflection.name
through_records.first.class.preload_associations(through_records, source, options)
through_records.each do |through_record|
- through_record_id = through_record[strat.primary_key].to_s
+ through_record_id = through_record[reflection.through_reflection_primary_key].to_s
add_preloaded_records_to_collection(id_to_record_map[through_record_id], reflection.name, through_record.send(source))
end
end
@@ -117,6 +117,11 @@ def sanitized_conditions #:nodoc:
@sanitized_conditions ||= klass.send(:sanitize_sql, options[:conditions]) if options[:conditions]
end
+ # Returns +true+ if +self+ is a +belongs_to+ reflection.
+ def belongs_to?
+ macro == :belongs_to
+ end
+
private
def derive_class_name
name.to_s.camelize
@@ -200,6 +205,9 @@ def through_reflection
false
end
+ def through_reflection_primary_key_name
+ end
+
def source_reflection
nil
end
@@ -212,7 +220,7 @@ def derive_class_name
end
def derive_primary_key_name
- if macro == :belongs_to
+ if belongs_to?
"#{name}_id"
elsif options[:as]
"#{options[:as]}_id"
@@ -281,6 +289,14 @@ def check_validity!
end
end
+ def through_reflection_primary_key
+ through_reflection.belongs_to? ? through_reflection.klass.primary_key : through_reflection.primary_key_name
+ end
+
+ def through_reflection_primary_key_name
+ through_reflection.primary_key_name if through_reflection.belongs_to?
+ end
+
private
def derive_class_name
# get the class_name of the belongs_to association of the through reflection

0 comments on commit 4918e6d

Please sign in to comment.