Sha256: 96aae76597eca9dfa0e9af6e3d93b1193b7a97f232456b923e52ba57e1cbbe55

Contents?: true

Size: 1.68 KB

Versions: 12

Compression:

Stored size: 1.68 KB

Contents

module ActiveRecord::MassLoad
  class MissingAssociation
    include Singleton
    def target
      nil
    end
  end

  def mass_load_associations!(models, *associations)
    if defined?(Rails) && Rails.env.development? && models.detect { |rec| !rec.is_a?(self) }
      raise "Invalid models for mass_load_associations!"
    end

    return models if models.length < 2

    associations.flatten!

    models_by_id = models.inject({}) do |hash, model|
      hash.update model.id => model
    end
    ids = models_by_id.keys
    id_condition = ActiveRecord::MassLoad.get_id_condition(ids)

    associations = associations.collect do |association|
      case association
      when Hash then association.to_a.collect do |k,v| { k => v } end
      else association
      end
    end.flatten

    associations.each do |association|
      if association.is_a?(Hash)
        association = association.to_a.first
        other_assocs = association
        association = other_assocs.shift
      end

      varname = "@#{association}"

      base_assocs = []

      find(:all, :include => association, :conditions => id_condition).each do |model|
        target = models_by_id[model.id]
        proxy = model.instance_variable_get(varname)
        target.instance_variable_set(varname, proxy || MissingAssociation.instance)
        base_assocs << proxy if proxy
      end

      next if !other_assocs || other_assocs.empty?
      next if base_assocs.empty?

      base_assocs.flatten!

      base_assocs.first.class.mass_load_associations! base_assocs, *other_assocs
    end

    models
  end
  
  def self.get_id_condition(ids)
    id_condition = { :id => ids.sort }
  end
end

ActiveRecord::Base.extend ActiveRecord::MassLoad

Version data entries

12 entries across 12 versions & 1 rubygems

Version Path
vex-0.6.2 lib/vex/active_record/mass_load.rb
vex-0.4.4 lib/vex/active_record/mass_load.rb
vex-0.4.2 lib/vex/active_record/mass_load.rb
vex-0.3.3 lib/vex/active_record/mass_load.rb
vex-0.2.9 lib/vex/active_record/mass_load.rb
vex-0.2.8 lib/vex/active_record/mass_load.rb
vex-0.2.7 lib/vex/active_record/mass_load.rb
vex-0.2.6 lib/vex/active_record/mass_load.rb
vex-0.2.5 lib/vex/active_record/mass_load.rb
vex-0.2.2 lib/vex/active_record/mass_load.rb
vex-0.2.1 lib/vex/active_record/mass_load.rb
vex-0.2 lib/vex/active_record/mass_load.rb