Class: ActiveRecord::Associations::Preloader::ThroughAssociation
- Inherits:
-
Association
- Object
- Association
- ActiveRecord::Associations::Preloader::ThroughAssociation
- Defined in:
- activerecord/lib/active_record/associations/preloader/through_association.rb
Overview
:nodoc:
Constant Summary collapse
- PRELOADER =
ActiveRecord::Associations::Preloader.new
Instance Method Summary collapse
-
#initialize ⇒ ThroughAssociation
constructor
A new instance of ThroughAssociation.
- #preloaded_records ⇒ Object
- #records_by_owner ⇒ Object
Methods inherited from Association
Constructor Details
#initialize ⇒ ThroughAssociation
Returns a new instance of ThroughAssociation.
9 10 11 12 |
# File 'activerecord/lib/active_record/associations/preloader/through_association.rb', line 9 def initialize(*) super @already_loaded = owners.first.association(through_reflection.name).loaded? end |
Instance Method Details
#preloaded_records ⇒ Object
14 15 16 |
# File 'activerecord/lib/active_record/associations/preloader/through_association.rb', line 14 def preloaded_records @preloaded_records ||= source_preloaders.flat_map(&:preloaded_records) end |
#records_by_owner ⇒ Object
18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
# File 'activerecord/lib/active_record/associations/preloader/through_association.rb', line 18 def records_by_owner return @records_by_owner if defined?(@records_by_owner) source_records_by_owner = source_preloaders.map(&:records_by_owner).reduce(:merge) through_records_by_owner = through_preloaders.map(&:records_by_owner).reduce(:merge) @records_by_owner = owners.each_with_object({}) do |owner, result| through_records = through_records_by_owner[owner] || [] if @already_loaded if source_type = reflection.[:source_type] through_records = through_records.select do |record| record[reflection.foreign_type] == source_type end end end records = through_records.flat_map do |record| source_records_by_owner[record] end records.compact! records.sort_by! { |rhs| preload_index[rhs] } if scope.order_values.any? records.uniq! if scope.distinct_value result[owner] = records end end |