Spec-Zone.ru › Ruby on Rails 5.1

модуль ActiveRecord::Core

Публичные методы класса

configurations() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 51
def self.configurations
  @@configurations
end

Возвращает полностью разрешённый хеш настроек

configurations=(config) Показать исходный код
# File activerecord/lib/active_record/core.rb, line 45
def self.configurations=(config)
  @@configurations = ActiveRecord::ConnectionHandling::MergeAndResolveDefaultUrlConfig.new(config).resolve
end

Содержит конфигурацию базы данных — как обычно хранится в config/database.yml — в виде хеша.

Например, следующий database.yml…

development:
  adapter: sqlite3
  database: db/development.sqlite3

production:
  adapter: sqlite3
  database: db/production.sqlite3

…приведёт к тому, что ::configurations будет выглядеть так:

{
   'development' => {
      'adapter'  => 'sqlite3',
      'database' => 'db/development.sqlite3'
   },
   'production' => {
      'adapter'  => 'sqlite3',
      'database' => 'db/production.sqlite3'
   }
}
connection_handler() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 141
def self.connection_handler
  ActiveRecord::RuntimeRegistry.connection_handler || default_connection_handler
end
connection_handler=(handler) Показать исходный код
# File activerecord/lib/active_record/core.rb, line 145
def self.connection_handler=(handler)
  ActiveRecord::RuntimeRegistry.connection_handler = handler
end
error_on_ignored_order_or_limit() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 81
      def self.error_on_ignored_order_or_limit
        ActiveSupport::Deprecation.warn("          The flag error_on_ignored_order_or_limit is deprecated. Limits are
          now supported. Please use error_on_ignored_order instead.
".squish)
        error_on_ignored_order
      end
error_on_ignored_order_or_limit=(value) Показать исходный код
# File activerecord/lib/active_record/core.rb, line 93
      def self.error_on_ignored_order_or_limit=(value)
        ActiveSupport::Deprecation.warn("          The flag error_on_ignored_order_or_limit is deprecated. Limits are
          now supported. Please use error_on_ignored_order= instead.
".squish)
        self.error_on_ignored_order = value
      end
new(attributes = nil) { |self| ... } Показать исходный код
# File activerecord/lib/active_record/core.rb, line 330
def initialize(attributes = nil)
  self.class.define_attribute_methods
  @attributes = self.class._default_attributes.deep_dup

  init_internals
  initialize_internals_callback

  assign_attributes(attributes) if attributes

  yield self if block_given?
  _run_initialize_callbacks
end

Новые объекты могут быть созданы либо пустыми (не передавать параметры), либо предварительно заполненными атрибутами, но ещё не сохранёнными (передать хеш с именами ключей, соответствующими именам столбцов связанной таблицы). В обоих случаях допустимые ключи атрибутов определяются именами столбцов связанной таблицы — поэтому у вас не может быть атрибутов, которые не являются частью столбцов таблицы.

Пример:

# Instantiates a single new object
User.new(first_name: 'Jamie')

Общедоступные методы экземпляров

<=>(other_object) Показать исходный код
# File activerecord/lib/active_record/core.rb, line 473
def <=>(other_object)
  if other_object.is_a?(self.class)
    to_key <=> other_object.to_key
  else
    super
  end
end

Разрешает сортировку по объектам

Вызывает метод суперкласса
==(comparison_object) Показать исходный код
# File activerecord/lib/active_record/core.rb, line 441
def ==(comparison_object)
  super ||
    comparison_object.instance_of?(self.class) &&
    !id.nil? &&
    comparison_object.id == id
end

Возвращает true, если comparison_object — это тот же самый объект, или comparison_object относится к тому же типу и self имеет ID, равный comparison_object.id.

Обратите внимание, что новые записи по определению отличаются от любых других записей, если только другая запись не является самим получателем. Кроме того, если вы загружаете существующие записи с помощью select и опускаете ID, вы на свой страх и риск, этот предикат вернёт false.

Также обратите внимание, что удаление записи сохраняет её ID в экземпляре модели, поэтому удалённые модели по-прежнему сравнимы.

Вызывает метод суперкласса
Также алиас: eql?
clone() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 392
    

Идентичен методу clone Ruby. Это «поверхностная» копия. Будьте осторожны, ваши атрибуты не копируются. Это означает, что изменение атрибутов копии изменит оригинал, поскольку они оба будут указывать на один и тот же хэш атрибутов. Если вам нужна копия вашего хэша атрибутов, пожалуйста, используйте метод dup.

user = User.first
new_user = user.clone
user.name               # => "Bob"
new_user.name = "Joe"
user.name               # => "Joe"

user.object_id == new_user.object_id            # => false
user.name.object_id == new_user.name.object_id  # => true

user.name.object_id == user.dup.name.object_id  # => false
connection_handler() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 492
def connection_handler
  self.class.connection_handler
end
dup() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 401
    

У дублированных объектов нет назначенного ID и они обрабатываются как новые записи. Обратите внимание, что это «поверхностная» копия, поскольку она копирует только атрибуты объекта, а не его ассоциации. Объем «глубокой» копии зависит от конкретной реализации приложения и, следовательно, предоставляется приложению для реализации в соответствии с его потребностями. Метод dup не сохраняет отметки времени (created|updated)_(at|on).

encode_with(coder) Показать исходный код
# File activerecord/lib/active_record/core.rb, line 426
def encode_with(coder)
  self.class.yaml_encoder.encode(@attributes, coder)
  coder["new_record"] = new_record?
  coder["active_record_yaml_version"] = 2
end

Заполните coder атрибутами этой записи, которые должны быть сериализованы. Структура coder в этом методе гарантированно соответствует структуре coder, переданной методу init_with.

Пример:

class Post < ActiveRecord::Base
end
coder = {}
Post.new.encode_with(coder)
coder # => {"attributes" => {"id" => nil, ... }}
eql?(comparison_object)
Псевдоним для: ==
error_on_ignored_order_or_limit() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 89
def error_on_ignored_order_or_limit
  self.class.error_on_ignored_order_or_limit
end
freeze() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 462
def freeze
  @attributes = @attributes.clone.freeze
  self
end

Создаёт копию и замораживает хэш атрибутов, чтобы ассоциации по-прежнему были доступны, даже для удалённых записей, но дублированные модели не будут заморожены.

frozen?() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 468
def frozen?
  @attributes.frozen?
end

Возвращает true если хэш атрибутов заморожен.

hash() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 451
def hash
  if id
    self.class.hash ^ id.hash
  else
    super
  end
end

Делегирует id, чтобы две записи одного типа и id работали с чем-то вроде:

[ Person.find(1), Person.find(2), Person.find(3) ] & [ Person.find(1), Person.find(4) ] # => [ Person.find(1) ]
Вызывает метод суперкласса
init_with(coder) { |self| ... } Показать исходный код
# File activerecord/lib/active_record/core.rb, line 357
def init_with(coder)
  coder = LegacyYamlAdapter.convert(self.class, coder)
  @attributes = self.class.yaml_encoder.decode(coder)

  init_internals

  @new_record = coder["new_record"]

  self.class.define_attribute_methods

  yield self if block_given?

  _run_find_callbacks
  _run_initialize_callbacks

  self
end

Инициализирует пустой объект модели из coder. coder должен быть результатом предыдущего кодирования модели Active Record с помощью метода encode_with.

class Post < ActiveRecord::Base
end

old_post = Post.new(title: "hello world")
coder = {}
old_post.encode_with(coder)

post = Post.allocate
post.init_with(coder)
post.title # => 'hello world'
inspect() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 497
def inspect
  # We check defined?(@attributes) not to issue warnings if the object is
  # allocated but not initialized.
  inspection = if defined?(@attributes) && @attributes
    self.class.attribute_names.collect do |name|
      if has_attribute?(name)
        "#{name}: #{attribute_for_inspect(name)}"
      end
    end.compact.join(", ")
  else
    "not initialized"
  end

  "#<#{self.class} #{inspection}>"
end

Возвращает содержимое записи в виде отформатированной строки.

pretty_print(pp) Показать исходный код
# File activerecord/lib/active_record/core.rb, line 515
def pretty_print(pp)
  return super if custom_inspect_method_defined?
  pp.object_address_group(self) do
    if defined?(@attributes) && @attributes
      column_names = self.class.column_names.select { |name| has_attribute?(name) || new_record? }
      pp.seplist(column_names, proc { pp.text "," }) do |column_name|
        column_value = read_attribute(column_name)
        pp.breakable " "
        pp.group(1) do
          pp.text column_name
          pp.text ":"
          pp.breakable
          pp.pp column_value
        end
      end
    else
      pp.breakable " "
      pp.text "not initialized"
    end
  end
end

Принимает PP и красиво выводит эту запись в него, позволяя получить хороший результат из pp record при необходимости pp.

Вызывает метод суперкласса
readonly!() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 488
def readonly!
  @readonly = true
end

Помечает эту запись как только для чтения.

readonly?() Показать исходный код
# File activerecord/lib/active_record/core.rb, line 483
def readonly?
  @readonly
end

Возвращает true если запись только для чтения. Записи, загруженные через соединения с атрибутами «навески», будут помечены как только для чтения, так как их нельзя сохранить.

slice(*methods) Показать исходный код
# File activerecord/lib/active_record/core.rb, line 538
def slice(*methods)
  Hash[methods.flatten.map! { |method| [method, public_send(method)] }].with_indifferent_access
end

Возвращает хэш заданных методов с их именами в качестве ключей и возвращаемыми значениями в качестве значений.

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

Spec-Zone.ru

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