Module: Discriminable::ClassMethods
- Defined in:
- lib/discriminable.rb
Overview
This adds
-
‘discriminable_attribute` and
-
‘discriminalbe_value`
class methods (plus some aliases).
Instance Method Summary collapse
-
#discriminable_as(*values) ⇒ Object
Specify the values the subclass corresponds to.
-
#discriminable_attribute(attribute) ⇒ Object
“Aliases” for discriminable_by.
-
#discriminable_by(attribute) ⇒ Object
Specify the attribute/column at the root class to use for discrimination.
- #discriminable_on(attribute) ⇒ Object
- #discriminable_value(*values) ⇒ Object
- #discriminable_values(*values) ⇒ Object
- #sti_class_for(value) ⇒ Object
-
#sti_name ⇒ Object
This is the value of the discriminable attribute.
- #sti_names ⇒ Object
- #type_condition(table = arel_table) ⇒ Object
Instance Method Details
#discriminable_as(*values) ⇒ Object
Specify the values the subclass corresponds to.
58 59 60 61 62 63 64 |
# File 'lib/discriminable.rb', line 58 def discriminable_as(*values) raise "Only subclasses should specify .discriminable_as" if base_class? self._discriminable_values = values.map do |value| value.instance_of?(Symbol) ? value.to_s : value end end |
#discriminable_attribute(attribute) ⇒ Object
“Aliases” for discriminable_by
49 50 51 |
# File 'lib/discriminable.rb', line 49 def discriminable_attribute(attribute) discriminable_by(attribute) end |
#discriminable_by(attribute) ⇒ Object
Specify the attribute/column at the root class to use for discrimination.
38 39 40 41 42 43 44 45 46 |
# File 'lib/discriminable.rb', line 38 def discriminable_by(attribute) raise "Subclasses should not override .discriminable_by" unless base_class? self._discriminable_map ||= _discriminable_map_memoized self._discriminable_inverse_map ||= _discriminable_inverse_map_memoized attribute = attribute.to_s self.inheritance_column = attribute_aliases[attribute] || attribute end |
#discriminable_on(attribute) ⇒ Object
53 54 55 |
# File 'lib/discriminable.rb', line 53 def discriminable_on(attribute) discriminable_by(attribute) end |
#discriminable_value(*values) ⇒ Object
66 67 68 |
# File 'lib/discriminable.rb', line 66 def discriminable_value(*values) discriminable_as(*values) end |
#discriminable_values(*values) ⇒ Object
70 71 72 |
# File 'lib/discriminable.rb', line 70 def discriminable_values(*values) discriminable_as(*values) end |
#sti_class_for(value) ⇒ Object
90 91 92 93 94 |
# File 'lib/discriminable.rb', line 90 def sti_class_for(value) return self unless (type_name = _discriminable_map[value]) super type_name end |
#sti_name ⇒ Object
This is the value of the discriminable attribute
75 76 77 |
# File 'lib/discriminable.rb', line 75 def sti_name _discriminable_inverse_map[name] end |
#sti_names ⇒ Object
79 80 81 |
# File 'lib/discriminable.rb', line 79 def sti_names ([self] + descendants).flat_map(&:_discriminable_values) end |
#type_condition(table = arel_table) ⇒ Object
83 84 85 86 87 88 |
# File 'lib/discriminable.rb', line 83 def type_condition(table = arel_table) return super unless _discriminable_values.present? sti_column = table[inheritance_column] predicate_builder.build(sti_column, sti_names) end |