class Wallaby::ActiveRecord::ModelDecorator::FieldsBuilder::StiBuilder

This class updates the field metadata's value of type and sti_class_list for STI (Single Table Inheritance) model

Public Class Methods

new(model_class) click to toggle source

@param model_class [Class]

# File lib/adapters/wallaby/active_record/model_decorator/fields_builder/sti_builder.rb, line 11
def initialize(model_class)
  @model_class = model_class
end

Public Instance Methods

update(metadata, column) click to toggle source

Update the field metadata's value for type and sti_class_list @param metadata [Hash] @param column [ActiveRecord::ConnectionAdapters::Column]

# File lib/adapters/wallaby/active_record/model_decorator/fields_builder/sti_builder.rb, line 18
def update(metadata, column)
  return unless @model_class.inheritance_column == column.name

  metadata[:type] = 'sti'
  metadata[:sti_class_list] = sti_list(find_sti_parent_of(@model_class))
end

Protected Instance Methods

find_sti_parent_of(klass) click to toggle source

Find out which parent is the one that can give us the STI list. @param klass [Class] @return [Class]

# File lib/adapters/wallaby/active_record/model_decorator/fields_builder/sti_builder.rb, line 38
def find_sti_parent_of(klass)
  parent = klass
  parent = parent.superclass until not_sti_parent?(parent.superclass)
  parent
end
not_sti_parent?(klass) click to toggle source

@param klass [Class] @return [true] if klass is ActiveRecord::Base or abstract @return [false] otherwise

# File lib/adapters/wallaby/active_record/model_decorator/fields_builder/sti_builder.rb, line 47
def not_sti_parent?(klass)
  klass == ::ActiveRecord::Base || klass.try(:abstract_class?)
end
sti_list(klass) click to toggle source

Return the alphabet-order STI list by traversing the inheritance tree for given model. @param klass [Class] @return [Array<Class>]

# File lib/adapters/wallaby/active_record/model_decorator/fields_builder/sti_builder.rb, line 31
def sti_list(klass)
  (klass.descendants << klass).sort_by(&:name)
end