Sha256: 08e3b63f1ffcbef8464188a12772254eedf8f8bf705fc2552ab6dbc5ffd51052

Contents?: true

Size: 1.91 KB

Versions: 9

Compression:

Stored size: 1.91 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

9 entries across 9 versions & 1 rubygems

Version Path
activerecord-turntable-4.4.1 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-4.4.0 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-4.3.0 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-4.2.0 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-4.1.0 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-4.0.0 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-3.1.0 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-3.0.1 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-3.0.0 lib/active_record/turntable/active_record_ext/clever_load.rb