module Sequel::Plugins::SingleTableInheritance::ClassMethods

  1. lib/sequel/plugins/single_table_inheritance.rb

Attributes

sti_dataset [R]

The base dataset for STI, to which filters are added to get only the models for the specific STI subclass.

sti_key [R]

The column name holding the STI key for this model

sti_key_array [R]

Array holding keys for all subclasses of this class, used for the dataset filter in subclasses. Nil in the main class.

sti_key_chooser [R]

A proc which returns the value to use for new instances. This defaults to a lookup in the key map.

sti_key_map [R]

A hash/proc with class keys and column value values, mapping the class to a particular value given to the #sti_key column. Used to set the column value when creating objects, and for the filter when retrieving objects in subclasses.

sti_model_map [R]

A hash/proc with column value keys and class values, mapping the value of the #sti_key column to the appropriate class to use.

Public Instance methods

inherited (subclass)

Copy the necessary attributes to the subclasses, and filter the subclass’s dataset based on the sti_kep_map entry for the class.

[show source]
# File lib/sequel/plugins/single_table_inheritance.rb, line 144
def inherited(subclass)
  super
  sk = sti_key
  sd = sti_dataset
  skm = sti_key_map
  smm = sti_model_map
  skc = sti_key_chooser
  key = Array(skm[subclass]).dup
  sti_subclass_added(key)
  rp = dataset.row_proc
  subclass.set_dataset(sd.filter(SQL::QualifiedIdentifier.new(table_name, sk)=>key), :inherited=>true)
  subclass.instance_eval do
    dataset.row_proc = rp
    @sti_key = sk
    @sti_key_array = key
    @sti_dataset = sd
    @sti_key_map = skm
    @sti_model_map = smm
    @sti_key_chooser = skc
    self.simple_table = nil
  end
end
sti_load (r)

Return an instance of the class specified by #sti_key, used by the row_proc.

[show source]
# File lib/sequel/plugins/single_table_inheritance.rb, line 169
def sti_load(r)
  sti_class(sti_model_map[r[sti_key]]).call(r)
end
sti_subclass_added (key)

Make sure that all subclasses of the parent class correctly include keys for all of their descendant classes.

[show source]
# File lib/sequel/plugins/single_table_inheritance.rb, line 175
def sti_subclass_added(key)
  if sti_key_array
    Sequel.synchronize{sti_key_array.push(*Array(key))}
    superclass.sti_subclass_added(key)
  end
end