Methods
Public Instance
Attributes
cti_base_model | [R] |
The parent/root/base model for this class table inheritance hierarchy. This is the only model in the hierarchy that load the class_table_inheritance plugin. |
cti_columns | [R] |
Hash with table name symbol keys and arrays of column symbol values, giving the columns to update in each backing database table. |
cti_key | [R] |
The column containing the class name as a string. Used to return instances of subclasses when calling the superclass’s load method. |
cti_table_map | [R] |
A hash with class name symbol keys and table name symbol values. Specified with the :table_map option to the plugin, and used if the implicit naming is incorrect. |
cti_tables | [R] |
An array of table symbols that back this model. The first is #cti_base_model table symbol, and the last is the current model table symbol. |
Public Instance methods
Add the appropriate data structures to the subclass. Does not allow anonymous subclasses to be created, since they would not be mappable to a table.
# File lib/sequel/plugins/class_table_inheritance.rb, line 128 def inherited(subclass) cc = cti_columns ck = cti_key ct = cti_tables.dup ctm = cti_table_map.dup cbm = cti_base_model pk = primary_key ds = dataset subclass.instance_eval do raise(Error, "cannot create anonymous subclass for model class using class_table_inheritance") if !(n = name) || n.empty? table = ctm[n.to_sym] || implicit_table_name columns = db.from(table).columns @cti_key = ck @cti_tables = ct + [table] @cti_columns = cc.merge(table=>columns) @cti_table_map = ctm @cti_base_model = cbm # Need to set dataset and columns before calling super so that # the main column accessor module is included in the class before any # plugin accessor modules (such as the lazy attributes accessor module). set_dataset(ds.join(table, [pk])) set_columns(self.columns) end super subclass.instance_eval do m = method(:constantize) dataset.row_proc = if cti_key lambda{|r| (m.call(r[ck]) rescue subclass).call(r)} else subclass end (columns - [cbm.primary_key]).each{|a| define_lazy_attribute_getter(a)} cti_tables.reverse.each do |table| db.schema(table).each{|k,v| db_schema[k] = v} end end end
The primary key in the parent/base/root model, which should have a foreign key with the same name referencing it in each model subclass.
# File lib/sequel/plugins/class_table_inheritance.rb, line 168 def primary_key return super if self == cti_base_model cti_base_model.primary_key end
The table name for the current model class’s main table (not used by any superclasses).
# File lib/sequel/plugins/class_table_inheritance.rb, line 175 def table_name self == cti_base_model ? super : cti_tables.last end