module Sequel::Plugins::LazyAttributes::InstanceMethods

Private Instance Methods

lazy_attribute_lookup(a, opts=OPTS) click to toggle source

If the model was selected with other model objects, eagerly load the attribute for all of those objects. If not, query the database for the attribute for just the current object. Return the value of the attribute for the current object.

# File lib/sequel/plugins/lazy_attributes.rb, line 94
def lazy_attribute_lookup(a, opts=OPTS)
  unless table = opts[:table]
    table = model.table_name
  end

  if base_ds = opts[:dataset]
    ds = base_ds.where(qualified_pk_hash(table))
  else
    base_ds = model.dataset
    ds = this
  end

  selection = Sequel.qualify(table, a)

  if frozen?
    return ds.dup.get(selection)
  end

  if retrieved_with
    raise(Error, "Invalid primary key column for #{model}: #{pkc.inspect}") unless primary_key = model.primary_key
    composite_pk = true if primary_key.is_a?(Array)
    id_map = {}
    retrieved_with.each{|o| id_map[o.pk] = o unless o.values.has_key?(a) || o.frozen?}
    predicate_key = composite_pk ? primary_key.map{|k| Sequel.qualify(table, k)} : Sequel.qualify(table, primary_key)
    base_ds.select(*(Array(primary_key).map{|k| Sequel.qualify(table, k)} + [selection])).where(predicate_key=>id_map.keys).naked.each do |row|
      obj = id_map[composite_pk ? row.values_at(*primary_key) : row[primary_key]]
      if obj && !obj.values.has_key?(a)
        obj.values[a] = row[a]
      end
    end
  end
  values[a] = ds.get(selection) unless values.has_key?(a)
  values[a]
end