module Sequel::Plugins::ClassTableInheritance::ClassMethods

Attributes

cti_instance_dataset[R]

The dataset that table instance datasets are based on. Used for database modifications

cti_models[R]

An array of each model in the inheritance hierarchy that uses an backed by a new table.

cti_table_columns[R]

An array of column symbols for the backing database table, giving the columns to update in each backing database table.

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

cti_base_model() click to toggle source

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
cti_columns() click to toggle source

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
cti_key() click to toggle source

Alias to sti_key, for backwards compatibility.

# File lib/sequel/plugins/class_table_inheritance.rb, line 250
def cti_key; sti_key; end
cti_model_map() click to toggle source

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
cti_table_name() click to toggle source

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() click to toggle source

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
inherited(subclass) click to toggle source
# 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
sti_class_from_key(key) click to toggle source
# File lib/sequel/plugins/class_table_inheritance.rb, line 343
def sti_class_from_key(key)
  sti_class(sti_model_map[key])
end
table_name() click to toggle source

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