# 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 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.
Hash with table name symbol keys and arrays of column symbol values, giving the columns to update in each backing database table.
The column containing the class name as a string. Used to return instances of subclasses when calling the superclass's load method.
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.
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.
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