module Sequel::Plugins::ClassTableInheritance::ClassMethods
Attributes
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.
Public Instance Methods
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 211 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 236 def cti_columns h = {} cti_models.each { |m| h[m.table_name] = m.cti_table_columns } h end
Alias to sti_key, for backwards compatibility.
# File lib/sequel/plugins/class_table_inheritance.rb, line 243 def cti_key; sti_key; end
Alias to sti_model_map, for backwards compatibility.
# File lib/sequel/plugins/class_table_inheritance.rb, line 246 def cti_model_map; sti_model_map; end
Freeze CTI information when freezing model class.
# File lib/sequel/plugins/class_table_inheritance.rb, line 249 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 261 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{db.from(table).columns} table = nil if !columns || columns.empty? end end table = nil if table && (table == 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(table_name, Sequel.identifier(cc))}) end cols = columns - [pk] unless (cols & ds.columns).empty? Sequel::Deprecation.deprecate('Using class_table_inheritance with duplicate column names 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.join(table, pk=>pk).select_append(*sel_app) set_dataset(@sti_dataset) 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=>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 317 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 313 def table_name cti_tables ? cti_tables.last : super end