Spec-Zone.ru › Ruby on Rails 4.2

модуль ActiveRecord::Inheritance::ClassMethods

Атрибуты

abstract_class[RW]

Установите значение в true, если это абстрактный класс (см. abstract_class?). Если вы используете наследование с ActiveRecord и не хотите, чтобы дочерние классы использовали предполагаемое имя таблицы STI родительского класса, это значение должно быть true. Например, в данном случае:

class SuperClass < ActiveRecord::Base
  self.abstract_class = true
end
class Child < SuperClass
  self.table_name = 'the_table_i_really_want'
end

self.abstract_class = true необходимо для того, чтобы Child<.find,.create, or any Arel method> использовал the_table_i_really_want вместо таблицы под названием super_classes

Публичные методы экземпляров

abstract_class?() Показать исходный код
# File activerecord/lib/active_record/inheritance.rb, line 130
def abstract_class?
  defined?(@abstract_class) && @abstract_class == true
end

Возвращает значение true, если этот класс является абстрактным, и false в противном случае.

base_class() Показать исходный код
# File activerecord/lib/active_record/inheritance.rb, line 100
def base_class
  unless self < Base
    raise ActiveRecordError, "#{name} doesn't belong in a hierarchy descending from ActiveRecord"
  end

  if superclass == Base || superclass.abstract_class?
    self
  else
    superclass.base_class
  end
end

Возвращает класс, непосредственно унаследованный от ActiveRecord::Base, или абстрактный класс, если таковой имеется, в иерархии наследования.

Если A наследуется от AR::Base, A.base_class вернет A. Если B наследуется от A через иерархию произвольной глубины, B.base_class вернет A.

Если B < A и C < B и если A является #abstract_class, то как B.base_class, так и C.base_class вернут B, так как A является абстрактным классом.

descends_from_active_record?() Показать исходный код
# File activerecord/lib/active_record/inheritance.rb, line 67
def descends_from_active_record?
  if self == Base
    false
  elsif superclass.abstract_class?
    superclass.descends_from_active_record?
  else
    superclass == Base || !columns_hash.include?(inheritance_column)
  end
end

Возвращает true, если для этого не требуется условие типа STI. Возвращает false, если условие типа STI необходимо применить.

new(*args, &block) Показать исходный код
# File activerecord/lib/active_record/inheritance.rb, line 48
def new(*args, &block)
  if abstract_class? || self == Base
    raise NotImplementedError, "#{self} is an abstract class and cannot be instantiated."
  end

  attrs = args.first
  if subclass_from_attributes?(attrs)
    subclass = subclass_from_attributes(attrs)
  end

  if subclass
    subclass.new(*args, &block)
  else
    super
  end
end

Определяет, является ли один из переданных атрибутов колонкой наследования, и если колонка наследования доступна для атрибутов, инициализирует экземпляр указанного подкласса вместо базового класса.

Вызывает метод суперкласса
sti_name() Показать исходный код
# File activerecord/lib/active_record/inheritance.rb, line 134
def sti_name
  store_full_sti_class ? name : name.demodulize
end
symbolized_base_class() Показать исходный код
# File activerecord/lib/active_record/inheritance.rb, line 82
def symbolized_base_class
  ActiveSupport::Deprecation.warn('`ActiveRecord::Base.symbolized_base_class` is deprecated and will be removed without replacement.')
  @symbolized_base_class ||= base_class.to_s.to_sym
end
symbolized_sti_name() Показать исходный код
# File activerecord/lib/active_record/inheritance.rb, line 87
def symbolized_sti_name
  ActiveSupport::Deprecation.warn('`ActiveRecord::Base.symbolized_sti_name` is deprecated and will be removed without replacement.')
  @symbolized_sti_name ||= sti_name.present? ? sti_name.to_sym : symbolized_base_class
end

Защищенные методы экземпляров

compute_type(type_name) Показать исходный код
# File activerecord/lib/active_record/inheritance.rb, line 142
def compute_type(type_name)
  if type_name.match(/^::/)
    # If the type is prefixed with a scope operator then we assume that
    # the type_name is an absolute reference.
    ActiveSupport::Dependencies.constantize(type_name)
  else
    # Build a list of candidates to search for
    candidates = []
    name.scan(/::|$/) { candidates.unshift "#{$`}::#{type_name}" }
    candidates << type_name

    candidates.each do |candidate|
      constant = ActiveSupport::Dependencies.safe_constantize(candidate)
      return constant if candidate == constant.to_s
    end

    raise NameError.new("uninitialized constant #{candidates.first}", candidates.first)
  end
end

Возвращает тип класса записи с использованием текущего модуля в качестве префикса. Таким образом, потомки MyApp::Business::Account будут отображаться как MyApp::Business::AccountSubclass.

© 2004–2018 David Heinemeier Hansson
Licensed under the MIT License.

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API