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

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_nameObject

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_namesObject



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