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