module Sequel::Plugins::SingleTableInheritance::ClassMethods

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

freeze() click to toggle source

Freeze STI information when freezing model class. Note that because of how STI works, you should not freeze an STI subclass until after all subclasses of it have been created.

Calls superclass method
    # File lib/sequel/plugins/single_table_inheritance.rb
158 def freeze
159   @sti_key_array.freeze if @sti_key_array
160   @sti_key_map.freeze if @sti_key_map.is_a?(Hash)
161   @sti_model_map.freeze if @sti_model_map.is_a?(Hash)
162 
163   super
164 end
inherited(subclass) click to toggle source

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

Calls superclass method
    # File lib/sequel/plugins/single_table_inheritance.rb
168 def inherited(subclass)
169   super
170   key = Array(sti_key_map[subclass]).dup
171   sti_subclass_added(key)
172   rp = dataset.row_proc
173   subclass.set_dataset(sti_subclass_dataset(key), :inherited=>true)
174   subclass.instance_exec do
175     @dataset = @dataset.with_row_proc(rp)
176     @sti_key_array = key
177     self.simple_table = nil
178   end
179 end
sti_class_from_sti_key(key) click to toggle source

Return the sti class based on one of the keys from sti_model_map.

    # File lib/sequel/plugins/single_table_inheritance.rb
188 def sti_class_from_sti_key(key)
189   sti_class(sti_model_map[key])
190 end
sti_load(r) click to toggle source

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

    # File lib/sequel/plugins/single_table_inheritance.rb
183 def sti_load(r)
184   sti_class_from_sti_key(r[sti_key]).call(r)
185 end
sti_subclass_added(key) click to toggle source

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

    # File lib/sequel/plugins/single_table_inheritance.rb
194 def sti_subclass_added(key)
195   if sti_key_array
196     key_array = Array(key)
197     Sequel.synchronize{sti_key_array.push(*key_array)}
198     superclass.sti_subclass_added(key)
199   end
200 end

Private Instance Methods

dataset_extend(mod, opts=OPTS) click to toggle source

Extend the sti dataset with the module when extending the main dataset.

Calls superclass method
    # File lib/sequel/plugins/single_table_inheritance.rb
206 def dataset_extend(mod, opts=OPTS)
207   @sti_dataset = @sti_dataset.with_extend(mod)
208   super
209 end
set_dataset_row_proc(ds) click to toggle source

If calling set_dataset manually, make sure to set the dataset row proc to one that handles inheritance correctly.

Calls superclass method
    # File lib/sequel/plugins/single_table_inheritance.rb
213 def set_dataset_row_proc(ds)
214   if @dataset
215     ds.with_row_proc(@dataset.row_proc)
216   else
217     super
218   end
219 end
sti_class(v) click to toggle source

Return a class object. If a class is given, return it directly. Treat strings and symbols as class names. If nil is given or an invalid class name string or symbol is used, return self. Raise an error for other types.

    # File lib/sequel/plugins/single_table_inheritance.rb
225 def sti_class(v)
226   case v
227   when String, Symbol
228     constantize(v) rescue self
229   when nil
230     self
231   when Class
232     v
233   else
234     raise(Error, "Invalid class type used: #{v.inspect}")
235   end
236 end
sti_subclass_dataset(key) click to toggle source

Use the given dataset for the subclass, with key being the allowed values for the sti_kind field.

    # File lib/sequel/plugins/single_table_inheritance.rb
240 def sti_subclass_dataset(key)
241   sti_dataset.where(SQL::QualifiedIdentifier.new(sti_dataset.first_source_alias, sti_key)=>Sequel.delay{Sequel.synchronize{key}})
242 end