| Module | Sequel::Plugins::SingleTableInheritance::ClassMethods |
| In: |
lib/sequel/plugins/single_table_inheritance.rb
|
| sti_dataset | [R] | The base dataset for STI, to which filters are added to get only the models for the specific STI subclass. |
| sti_key | [R] | The column name holding the STI key for this model |
| sti_key_array | [R] | Array holding keys for all subclasses of this class, used for the dataset filter in subclasses. Nil in the main class. |
| sti_key_chooser | [R] | A proc which returns the value to use for new instances. This defaults to a lookup in the key map. |
| sti_key_map | [R] | 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. |
| sti_model_map | [R] | A hash/proc with column value keys and class values, mapping the value of the sti_key column to the appropriate class to use. |
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.
# File lib/sequel/plugins/single_table_inheritance.rb, line 158
158: def freeze
159: @sti_key_array.freeze if @sti_key_array
160: @sti_key_map.freeze if @sti_key_map.is_a?(Hash)
161: @sti_model_map.freeze if @sti_model_map.is_a?(Hash)
162:
163: super
164: end
Copy the necessary attributes to the subclasses, and filter the subclass‘s dataset based on the sti_kep_map entry for the class.
# File lib/sequel/plugins/single_table_inheritance.rb, line 168
168: def inherited(subclass)
169: super
170: key = Array(sti_key_map[subclass]).dup
171: sti_subclass_added(key)
172: rp = dataset.row_proc
173: subclass.set_dataset(sti_subclass_dataset(key), :inherited=>true)
174: subclass.instance_exec do
175: @dataset = @dataset.with_row_proc(rp)
176: @sti_key_array = key
177: self.simple_table = nil
178: end
179: end
Return the sti class based on one of the keys from sti_model_map.
# File lib/sequel/plugins/single_table_inheritance.rb, line 188
188: def sti_class_from_sti_key(key)
189: sti_class(sti_model_map[key])
190: end
Return an instance of the class specified by sti_key, used by the row_proc.
# File lib/sequel/plugins/single_table_inheritance.rb, line 183
183: def sti_load(r)
184: sti_class_from_sti_key(r[sti_key]).call(r)
185: end
Make sure that all subclasses of the parent class correctly include keys for all of their descendant classes.
# File lib/sequel/plugins/single_table_inheritance.rb, line 194
194: def sti_subclass_added(key)
195: if sti_key_array
196: key_array = Array(key)
197: Sequel.synchronize{sti_key_array.push(*key_array)}
198: superclass.sti_subclass_added(key)
199: end
200: end