Module: Torque::PostgreSQL::Inheritance::ClassMethods

Defined in:
lib/torque/postgresql/inheritance.rb

Instance Method Summary collapse

Instance Method Details

#base_classObject

For all main purposes, physical inherited classes should have base_class as their own



92
93
94
95
# File 'lib/torque/postgresql/inheritance.rb', line 92

def base_class
  return super unless physically_inherited?
  self
end

#casted_dependentsObject

Get the list of all ActiveRecord classes directly or indirectly associated by inheritance



60
61
62
63
64
# File 'lib/torque/postgresql/inheritance.rb', line 60

def casted_dependents
  @casted_dependents ||= inheritance_dependents.map do |table_name|
    [table_name, connection.schema_cache.lookup_model(table_name)]
  end.to_h
end

#compute_table_nameObject

Add an additional check to return the name of the table even when the class is inherited, but only if it is a physical inheritance



106
107
108
109
# File 'lib/torque/postgresql/inheritance.rb', line 106

def compute_table_name
  return super unless physically_inherited?
  decorated_table_name
end

#decorated_table_nameObject

Get the final decorated table, regardless of any special condition



80
81
82
83
84
85
86
87
88
# File 'lib/torque/postgresql/inheritance.rb', line 80

def decorated_table_name
  if parent < Base && !parent.abstract_class?
    contained = parent.table_name
    contained = contained.singularize if parent.pluralize_table_names
    contained += "_"
  end

  "#{full_table_name_prefix}#{contained}#{undecorated_table_name(name)}#{full_table_name_suffix}"
end

#inheritance_dependentsObject

Get the list of all tables directly or indirectly dependent of the current one



49
50
51
# File 'lib/torque/postgresql/inheritance.rb', line 49

def inheritance_dependents
  connection.schema_cache.associations(table_name) || []
end

#inheritance_merged_attributesObject

Get a full list of all attributes from a model and all its dependents



32
33
34
35
36
37
38
# File 'lib/torque/postgresql/inheritance.rb', line 32

def inheritance_merged_attributes
  @inheritance_merged_attributes ||= begin
    list = attribute_names
    list += casted_dependents.values.map(&:attribute_names)
    list.flatten.to_set.freeze
  end
end

#physically_inheritances?Boolean

Check whether the model’s table has directly or indirectly dependents

Returns:

  • (Boolean)


54
55
56
# File 'lib/torque/postgresql/inheritance.rb', line 54

def physically_inheritances?
  inheritance_dependents.present?
end

#physically_inherited?Boolean

Check if the model’s table depends on any inheritance

Returns:

  • (Boolean)


41
42
43
44
45
# File 'lib/torque/postgresql/inheritance.rb', line 41

def physically_inherited?
  @physically_inherited ||= connection.schema_cache.dependencies(
    defined?(@table_name) ? @table_name : decorated_table_name,
  ).present?
end

#primary_keyObject

Primary key is one exception when getting information about the class, it must returns the superclass PK



99
100
101
102
# File 'lib/torque/postgresql/inheritance.rb', line 99

def primary_key
  return super unless physically_inherited?
  superclass.primary_key
end

#raise_unable_to_cast(record_class_value) ⇒ Object

Raises an error message saying that the giver record class was not able to be casted since the model was not identified

Raises:



113
114
115
116
117
118
119
120
# File 'lib/torque/postgresql/inheritance.rb', line 113

def raise_unable_to_cast(record_class_value)
  raise InheritanceError.new(<<~MSG.squish)
    An record was not able to be casted to type '#{record_class_value}'.
    If this table name doesn't represent a guessable model,
    please use 'Torque::PostgreSQL.conf.irregular_models =
    { '#{record_class_value}' => 'ModelName' }'.
  MSG
end

#reset_table_nameObject

Manually set the model name associated with tables name in order to facilitates the identification of inherited records



68
69
70
71
72
73
74
75
76
77
# File 'lib/torque/postgresql/inheritance.rb', line 68

def reset_table_name
  table = super

  adapter = ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
  if Torque::PostgreSQL.config.eager_load && connection.is_a?(adapter)
    connection.schema_cache.add_model_name(table, self)
  end

  table
end