Module: Sequel::Plugins::SingleTableInheritance::ClassMethods

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

Instance Attribute Summary collapse

Instance Method Summary collapse

Instance Attribute Details

#sti_datasetObject (readonly)

The base dataset for STI, to which filters are added to get only the models for the specific STI subclass.


130
131
132
# File 'lib/sequel/plugins/single_table_inheritance.rb', line 130

def sti_dataset
  @sti_dataset
end

#sti_keyObject (readonly)

The column name holding the STI key for this model


133
134
135
# File 'lib/sequel/plugins/single_table_inheritance.rb', line 133

def sti_key
  @sti_key
end

#sti_key_arrayObject (readonly)

Array holding keys for all subclasses of this class, used for the dataset filter in subclasses. Nil in the main class.


137
138
139
# File 'lib/sequel/plugins/single_table_inheritance.rb', line 137

def sti_key_array
  @sti_key_array
end

#sti_key_chooserObject (readonly)

A proc which returns the value to use for new instances. This defaults to a lookup in the key map.


151
152
153
# File 'lib/sequel/plugins/single_table_inheritance.rb', line 151

def sti_key_chooser
  @sti_key_chooser
end

#sti_key_mapObject (readonly)

A hash/proc with class keys and column value values, mapping the class to a particular value given to the sti_key column. Used to set the column value when creating objects, and for the filter when retrieving objects in subclasses.


143
144
145
# File 'lib/sequel/plugins/single_table_inheritance.rb', line 143

def sti_key_map
  @sti_key_map
end

#sti_model_mapObject (readonly)

A hash/proc with column value keys and class values, mapping the value of the sti_key column to the appropriate class to use.


147
148
149
# File 'lib/sequel/plugins/single_table_inheritance.rb', line 147

def sti_model_map
  @sti_model_map
end

Instance Method Details

#freezeObject

Freeze STI information when freezing model class. Note that because of how STI works, you should not freeze an STI subclass until after all subclasses of it have been created.


158
159
160
161
162
163
164
# File 'lib/sequel/plugins/single_table_inheritance.rb', line 158

def freeze
  @sti_key_array.freeze if @sti_key_array
  @sti_key_map.freeze if @sti_key_map.is_a?(Hash)
  @sti_model_map.freeze if @sti_model_map.is_a?(Hash)

  super
end

#inherited(subclass) ⇒ Object

Copy the necessary attributes to the subclasses, and filter the subclass's dataset based on the sti_kep_map entry for the class.


168
169
170
171
172
173
174
175
176
177
178
179
# File 'lib/sequel/plugins/single_table_inheritance.rb', line 168

def inherited(subclass)
  super
  key = Array(sti_key_map[subclass]).dup
  sti_subclass_added(key)
  rp = dataset.row_proc
  subclass.set_dataset(sti_subclass_dataset(key), :inherited=>true)
  subclass.instance_exec do
    @dataset = @dataset.with_row_proc(rp)
    @sti_key_array = key
    self.simple_table = nil
  end
end

#sti_class_from_sti_key(key) ⇒ Object

Return the sti class based on one of the keys from sti_model_map.


188
189
190
# File 'lib/sequel/plugins/single_table_inheritance.rb', line 188

def sti_class_from_sti_key(key)
  sti_class(sti_model_map[key])
end

#sti_load(r) ⇒ Object

Return an instance of the class specified by sti_key, used by the row_proc.


183
184
185
# File 'lib/sequel/plugins/single_table_inheritance.rb', line 183

def sti_load(r)
  sti_class_from_sti_key(r[sti_key]).call(r)
end

#sti_subclass_added(key) ⇒ Object

Make sure that all subclasses of the parent class correctly include keys for all of their descendant classes.


194
195
196
197
198
199
200
# File 'lib/sequel/plugins/single_table_inheritance.rb', line 194

def sti_subclass_added(key)
  if sti_key_array
    key_array = Array(key)
    Sequel.synchronize{sti_key_array.push(*key_array)}
    superclass.sti_subclass_added(key)
  end
end