Sha256: 460215a136dd62704cdc09c0888f22fc94865c34317e6e11c426275303751c24

Contents?: true

Size: 1.77 KB

Versions: 8

Compression:

Stored size: 1.77 KB

Contents

module ActiveRecord::Turntable::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
      reflection = klass.reflections[association_name]

      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

Version data entries

8 entries across 8 versions & 1 rubygems

Version Path
activerecord-turntable-2.0.6 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-2.0.5 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-2.0.4 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-2.0.3 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-2.0.2 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-2.0.1 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-2.0.0 lib/active_record/turntable/active_record_ext/clever_load.rb
activerecord-turntable-2.0.0.rc1 lib/active_record/turntable/active_record_ext/clever_load.rb