Sha256: 92c4edf1ac712a0893995dd9ab0dcd1ca47a6b85f61b2159df5e046ee0222afc

Contents?: true

Size: 1.9 KB

Versions: 3

Compression:

Stored size: 1.9 KB

Contents

module ActiveRecord::Turntable
  module ActiveRecordExt
    module CleverLoad
      extend ActiveSupport::Concern

      included do
        class << ActiveRecord::Base
          delegate :clever_load!, to: :all
        end
      end

      def clever_load!(association_name)
        # load records
        records = self.to_a
        klass = records.first.class
        association_key = association_name.to_s
        reflection = klass.reflections[association_key]

        if reflection
          foreign_class = reflection.klass
          foreign_objects = case reflection.macro
                            when :has_one
                              foreign_class.where(reflection.foreign_key => records.map(&reflection.association_primary_key.to_sym).uniq)
                            when :belongs_to
                              foreign_class.where(reflection.association_primary_key => records.map(&reflection.foreign_key.to_sym).uniq)
                            else
                              []
                            end

          self.each do |obj|
            matched_object = case reflection.macro
                             when :has_one
                               foreign_objects.find {|fo|
                                 obj.send(reflection.association_primary_key) == fo.send(reflection.foreign_key)
                               }
                             when :belongs_to
                               foreign_objects.find {|fo|
                                 obj.send(reflection.foreign_key) == fo.send(reflection.association_primary_key)
                               }
                             end
            obj.association(association_name).target = matched_object
            obj.association(association_name).set_inverse_instance(matched_object) if matched_object
            obj.association(association_name).loaded!
          end
        end
        records
      end
    end
  end
end

Version data entries

3 entries across 3 versions & 1 rubygems

Version Path
activerecord-turntable-3.0.0.alpha3 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-3.0.0.alpha2 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-3.0.0.alpha1 lib/active_record/turntable/active_record_ext/clever_load.rb