module ActiveRecord::Cti::SubClass

Public Instance Methods

default_select_columns() click to toggle source

Get columns to pass joins while calling default_scope.

# File lib/activerecord/cti/sub_class.rb, line 52
def default_select_columns
  ((superclass_column_names - [primary_key]).collect do |key|
    "#{superclass_table_name}.#{key}"
  end + subclass_column_names.collect do |key|
    "#{subclass_table_name}.#{key}"
  end).join(',')
end
find_by(*args) click to toggle source
Calls superclass method
# File lib/activerecord/cti/sub_class.rb, line 60
def find_by(*args)
  unless subclass_column_names.include?(args.first.keys.first)
    args = [{"#{superclass_table_name}.#{args.first.keys.first.to_s}": args.first.values.first}]
  end
  super
end
foreign_key_name() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 47
def foreign_key_name
  superclass.to_s.foreign_key
end
load_schema!() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 75
def load_schema!
  @columns_hash = superclass_columns_hash.merge(subclass_columns_hash)
  @columns_hash.each do |name, column|
    define_attribute(
      name,
      connection.lookup_cast_type_from_column(column),
      default: column.default,
      user_provided_default: false
    )
  end
end
save(*args, &block) click to toggle source

To save into two related tables while inserting.

# File lib/activerecord/cti/sub_class.rb, line 113
def save(*args, &block)
  _superclass_instance_for_rw = superclass_instance_for_rw
  _subclass_instance_for_rw = subclass_instance_for_rw
  ActiveRecord::Base.transaction do
    _superclass_instance_for_rw.send(:create_or_update)
    _subclass_instance_for_rw.send("#{foreign_key_name}=", _superclass_instance_for_rw.id)
    _subclass_instance_for_rw.send(:create_or_update)
  end
  self.id = _subclass_instance_for_rw.id
  _superclass_instance_for_rw.id.present? and _subclass_instance_for_rw.id.present?
rescue ActiveRecord::RecordInvalid
  false
end
subclass_column_names() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 99
def subclass_column_names
  subclass_columns_hash.keys
end
subclass_columns_hash() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 95
def subclass_columns_hash
  connection.schema_cache.columns_hash(subclass_table_name).except(*subclass_ignored_columns)
end
subclass_ignored_columns() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 107
def subclass_ignored_columns
  [foreign_key_name]
end
subclass_table_name() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 43
def subclass_table_name
  table_name
end
superclass_column_names() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 91
def superclass_column_names
  superclass_columns_hash.keys
end
superclass_columns_hash() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 87
def superclass_columns_hash
  connection.schema_cache.columns_hash(superclass_table_name).except(*superclass_ignored_columns)
end
superclass_ignored_columns() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 103
def superclass_ignored_columns
  ["created_at", "updated_at"]
end
superclass_name() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 35
def superclass_name
  superclass.to_s
end
superclass_table_name() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 39
def superclass_table_name
  superclass_name.tableize
end
where(opts = :chain, *rest) click to toggle source
Calls superclass method
# File lib/activerecord/cti/sub_class.rb, line 67
def where(opts = :chain, *rest)
  unless subclass_column_names.include?(opts.keys.first)
    opts = {"#{superclass_table_name}.#{opts.keys.first.to_s}": opts.values.first}
  end
  super
end

Private Instance Methods

foreign_key_value() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 152
def foreign_key_value
  return @foreign_key_value if @foreign_key_value.present?
  return nil if self.id.nil?
  @foreign_key = subclass_for_rw.find(self.id)&.send(foreign_key_name)
end
foreign_key_value=(value) click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 158
def foreign_key_value=(value)
  @foreign_key_value = value
end
subclass_for_rw() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 169
def subclass_for_rw
  table_name = self.class.subclass_table_name
  @subclass_for_rw || @subclass_for_rw = Class.new(ActiveRecord::Base) do
    self.table_name = table_name
  end
end
subclass_instance_for_rw(*args, &block) click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 138
def subclass_instance_for_rw(*args, &block)
  if self.id.present?
    subclass_instance_for_rw = subclass_for_rw.find(self.id)
    subclass_instance_for_rw.attributes = attributes.except(*superclass_for_rw.column_names)
    subclass_instance_for_rw
  else
    subclass_for_rw.new(attributes.except(*superclass_for_rw.column_names), &block)
  end
end
superclass_for_rw() click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 162
def superclass_for_rw
  table_name = self.class.superclass_table_name
  @superclass_for_rw || @superclass_for_rw = Class.new(ActiveRecord::Base) do
    self.table_name = table_name
  end
end
superclass_instance_for_rw(*args, &block) click to toggle source
# File lib/activerecord/cti/sub_class.rb, line 128
def superclass_instance_for_rw(*args, &block)
  if foreign_key_value.present?
    superclass_instance_for_rw = superclass_for_rw.find(foreign_key_value)
    superclass_instance_for_rw.attributes = attributes.slice(*superclass_for_rw.column_names - [@primary_key])
    superclass_instance_for_rw
  else
    superclass_for_rw.new(attributes.slice(*superclass_for_rw.column_names), &block)
  end
end