123456789_123456789_123456789_123456789_123456789_

Module: ActiveRecord::AttributeMethods::PrimaryKey::ClassMethods

Relationships & Source Files
Defined in: activerecord/lib/active_record/attribute_methods/primary_key.rb

Constant Summary

Instance Attribute Summary

Instance Method Summary

Instance Attribute Details

#composite_primary_key? ⇒ Boolean (readonly)

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/primary_key.rb', line 85

def composite_primary_key? # :nodoc:
  primary_key_definition&.composite?
end

#primary_key (rw)

Defines the primary key field -- can be overridden in subclasses. Overwriting will negate any effect of the primary_key_prefix_type setting, though.

[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/primary_key.rb', line 81

def primary_key
  primary_key_definition.name
end

#primary_key=(value) (rw)

Sets the name of the primary key column.

class Project < {ActiveRecord::Base}
  self.primary_key = 'sysid'
end
[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/primary_key.rb', line 127

def primary_key=(value)
  @primary_key_definition = ActiveRecord::Key.for(value)
  @primary_key_inherited = false

  include CompositePrimaryKey if primary_key_definition.composite?

  # Only invalidate loaded contexts; initial schema loading can resolve the primary key.
  ([self] + descendants).each do |model|
    model.clear_inherited_primary_key
    model.reload_schema_from_cache(false) if model.schema_loaded?
    # Regenerate so the id_value reader is replaced by an alias.
    model.undefine_attribute_methods if primary_key_definition.composite? && model.attribute_methods_generated?
  end
end

Instance Method Details

#clear_inherited_primary_key (protected)

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/primary_key.rb', line 143

def clear_inherited_primary_key # :nodoc:
  @primary_key_definition = nil if @primary_key_inherited
end

#dangerous_attribute_method?(method_name) ⇒ Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/primary_key.rb', line 74

def dangerous_attribute_method?(method_name)
  super && !ID_ATTRIBUTE_METHODS.include?(method_name)
end

#get_primary_key(base_name)

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/primary_key.rb', line 108

def get_primary_key(base_name) # :nodoc:
  if base_name && primary_key_prefix_type == :table_name
    base_name.foreign_key(false)
  elsif base_name && primary_key_prefix_type == :table_name_with_underscore
    base_name.foreign_key
  elsif ActiveRecord::Base != self && table_exists?
    schema_cache.primary_keys(table_name)
  else
    "id"
  end
end

#inherited_primary_key_definition (private)

[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/primary_key.rb', line 166

def inherited_primary_key_definition
  klass = self
  while klass != Base
    klass = klass.superclass
    definition = klass.instance_variable_get(:@primary_key_definition)
    return definition if definition
  end
  nil
end

#instance_method_already_implemented?(method_name) ⇒ Boolean

[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/primary_key.rb', line 70

def instance_method_already_implemented?(method_name)
  super || primary_key && ID_ATTRIBUTE_METHODS.include?(method_name)
end

#load_primary_key_definition (private)

Subclasses inherit the primary key of the closest ancestor that has one, otherwise it is resolved from the schema.

[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/primary_key.rb', line 150

def load_primary_key_definition
  ActiveSupport::Ractors.on_main(self) do
    definition = inherited_primary_key_definition
    definition ||= base_class.primary_key_definition unless base_class?

    if definition
      @primary_key_definition = definition
      @primary_key_inherited = true
    else
      reset_primary_key
    end

    @primary_key_definition
  end
end

#primary_key_definition

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/primary_key.rb', line 89

def primary_key_definition # :nodoc:
  @primary_key_definition || load_primary_key_definition
end

#quoted_primary_key

Returns a quoted version of the primary key name.

[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/primary_key.rb', line 94

def quoted_primary_key
  adapter_class.quote_column_name(primary_key)
end

#reset_primary_key

This method is for internal use only.
[ GitHub ]

  
# File 'activerecord/lib/active_record/attribute_methods/primary_key.rb', line 98

def reset_primary_key # :nodoc:
  ActiveSupport::Ractors.on_main(self) do
    if base_class?
      self.primary_key = get_primary_key(base_class.name)
    else
      self.primary_key = base_class.primary_key
    end
  end
end