Module: Sequel::Plugins::ClassTableInheritance::ClassMethods

Defined in:
lib/sequel/plugins/class_table_inheritance.rb

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#cti_base_modelObject (readonly)

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.



131
132
133
# File 'lib/sequel/plugins/class_table_inheritance.rb', line 131

def cti_base_model
  @cti_base_model
end

#cti_columnsObject (readonly)

Hash with table name symbol keys and arrays of column symbol values, giving the columns to update in each backing database table.



135
136
137
# File 'lib/sequel/plugins/class_table_inheritance.rb', line 135

def cti_columns
  @cti_columns
end

#cti_keyObject (readonly)

The column containing the class name as a string. Used to return instances of subclasses when calling the superclass’s load method.



140
141
142
# File 'lib/sequel/plugins/class_table_inheritance.rb', line 140

def cti_key
  @cti_key
end

#cti_model_mapObject (readonly)

A hash with keys being values of the cti_key column, and values being class name strings or symbols. Used if you don’t want to store class names in the database.



145
146
147
# File 'lib/sequel/plugins/class_table_inheritance.rb', line 145

def cti_model_map
  @cti_model_map
end

#cti_table_mapObject (readonly)

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.



155
156
157
# File 'lib/sequel/plugins/class_table_inheritance.rb', line 155

def cti_table_map
  @cti_table_map
end

#cti_tablesObject (readonly)

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.



150
151
152
# File 'lib/sequel/plugins/class_table_inheritance.rb', line 150

def cti_tables
  @cti_tables
end

Instance Method Details

#inherited(subclass) ⇒ Object

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.



160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
# File 'lib/sequel/plugins/class_table_inheritance.rb', line 160

def inherited(subclass)
  cc = cti_columns
  ck = cti_key
  ct = cti_tables.dup
  ctm = cti_table_map.dup
  cbm = cti_base_model
  cmm = cti_model_map
  pk = primary_key
  ds = dataset
  table = nil
  columns = nil
  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
    @cti_model_map = cmm
    # 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=>pk).select_append(*(columns - [primary_key]).map{|c| Sequel.qualify(table, Sequel.identifier(c))}))
    set_columns(self.columns)
  end
  super
  subclass.instance_eval do
    set_dataset_cti_row_proc
    (columns - [cbm.primary_key]).each{|a| define_lazy_attribute_getter(a, :dataset=>dataset, :table=>table)}
    cti_tables.reverse.each do |t|
      db.schema(t).each{|k,v| db_schema[k] = v}
    end
  end
end

#primary_keyObject

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.



199
200
201
202
# File 'lib/sequel/plugins/class_table_inheritance.rb', line 199

def primary_key
  return super if self == cti_base_model
  cti_base_model.primary_key
end

#table_nameObject

The table name for the current model class’s main table (not used by any superclasses).



206
207
208
# File 'lib/sequel/plugins/class_table_inheritance.rb', line 206

def table_name
  self == cti_base_model ? super : cti_tables.last
end