The dataset that table instance datasets are based on. Used for database modifications
An array of each model in the inheritance hierarchy that uses an backed by a new table.
An array of column symbols for the backing database table, giving the columns to update in each backing database table.
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.
The parent/root/base model for this class table inheritance hierarchy. This is the only model in the hierarchy that loads the class_table_inheritance plugin. For backwards compatibility.
# File lib/sequel/plugins/class_table_inheritance.rb, line 218 def cti_base_model @cti_models.first end
Hash with table name symbol keys and arrays of column symbol values, giving the columns to update in each backing database table. For backwards compatibility.
# File lib/sequel/plugins/class_table_inheritance.rb, line 243 def cti_columns h = {} cti_models.each { |m| h[m.cti_table_name] = m.cti_table_columns } h end
Alias to sti_key, for backwards compatibility.
# File lib/sequel/plugins/class_table_inheritance.rb, line 250 def cti_key; sti_key; end
Alias to sti_model_map, for backwards compatibility.
# File lib/sequel/plugins/class_table_inheritance.rb, line 253 def cti_model_map; sti_model_map; end
The name of the most recently joined table.
# File lib/sequel/plugins/class_table_inheritance.rb, line 339 def cti_table_name cti_tables ? cti_tables.last : dataset.first_source_alias end
Freeze CTI information when freezing model class.
# File lib/sequel/plugins/class_table_inheritance.rb, line 256 def freeze @cti_models.freeze @cti_tables.freeze @cti_instance_dataset.freeze @cti_table_columns.freeze @cti_table_map.freeze super end
# File lib/sequel/plugins/class_table_inheritance.rb, line 268 def inherited(subclass) ds = sti_dataset # Prevent inherited in model/base.rb from setting the dataset subclass.instance_eval { @dataset = nil } super # Set table if this is a class table inheritance table = nil columns = nil if (n = subclass.name) && !n.empty? if table = cti_table_map[n.to_sym] columns = db.from(table).columns else table = subclass.implicit_table_name columns = check_non_connection_error(false){db.from(table).columns} table = nil if !columns || columns.empty? end end table = nil if table && (table == cti_table_name) return unless table pk = primary_key subclass.instance_eval do if cti_tables.length == 1 ds = ds.select(*self.columns.map{|cc| Sequel.qualify(cti_table_name, Sequel.identifier(cc))}) end cols = columns - [pk] dup_cols = cols & ds.columns unless dup_cols.empty? Sequel::Deprecation.deprecate("Using class_table_inheritance with duplicate column names (#{n} => #{dup_cols}) in subclass tables (other than the primary key column)', 'Make sure all tables used have unique column names, or implement support for handling duplicate column names in the class_table_inheritance plugin") end sel_app = cols.map{|cc| Sequel.qualify(table, Sequel.identifier(cc))} @sti_dataset = ds = ds.join(table, pk=>pk).select_append(*sel_app) if @cti_alias ds = ds.from_self(:alias=>@cti_alias) end set_dataset(ds) set_columns(self.columns) @dataset = @dataset.with_row_proc(lambda{|r| subclass.sti_load(r)}) cols.each{|a| define_lazy_attribute_getter(a, :dataset=>dataset, :table=>@cti_alias||table)} @cti_models += [self] @cti_tables += [table] @cti_table_columns = columns @cti_instance_dataset = db.from(table) cti_tables.reverse_each do |ct| db.schema(ct).each{|sk,v| db_schema[sk] = v} end end end
# File lib/sequel/plugins/class_table_inheritance.rb, line 343 def sti_class_from_key(key) sti_class(sti_model_map[key]) end
The table name for the current model class’s main table.
# File lib/sequel/plugins/class_table_inheritance.rb, line 326 def table_name if cti_tables if @cti_alias @cti_alias else cti_tables.last end else super end end