модуль ActiveRecord
Active Record – Объектно-реляционное отображение в Rails
Active Record связывает классы с таблицами реляционной базы данных, чтобы создать почти полностью безконфигурационный слой сохранения для приложений. Библиотека предоставляет базовый класс, который при наследовании настраивает отображение между новым классом и существующей таблицей в базе данных. В контексте приложения эти классы обычно называют моделями. Модели также могут быть связаны с другими моделями; это делается путем определения ассоциаций.
Active Record сильно зависит от именования, так как использует имена классов и ассоциаций для установления соответствия между соответствующими таблицами базы данных и столбцами внешних ключей. Хотя эти соответствия можно определять явно, рекомендуется придерживаться соглашений об именовании, особенно при первом знакомстве с библиотекой.
Дополнительную информацию об Active Record можно найти в руководстве Основы Active Record.
Краткое описание некоторых основных функций:
-
Автоматическое отображение соответствия между классами и таблицами, атрибутами и столбцами.
class Product < ActiveRecord::Base end
Класс Product автоматически отображается на таблицу с именем «products», которая может выглядеть так:
CREATE TABLE products ( id bigint NOT NULL auto_increment, name varchar(255), PRIMARY KEY (id) );
Это также определит следующие аксессоры:
Product#nameиProduct#name=(new_name).Узнать больше
-
Associationsмежду объектами, определенными простыми методами класса.class Firm < ActiveRecord::Base has_many :clients has_one :account belongs_to :conglomerate end
Узнать больше
-
Aggregationsобъектов-значений.class Account < ActiveRecord::Base composed_of :balance, class_name: 'Money', mapping: %w(balance amount) composed_of :address, mapping: [%w(address_street street), %w(address_city city)] endУзнать больше
-
Правила проверки, которые могут отличаться для новых или существующих объектов.
class Account < ActiveRecord::Base validates :subdomain, :name, :email_address, :password, presence: true validates :subdomain, uniqueness: true validates :terms_of_service, acceptance: true, on: :create validates :password, :email_address, confirmation: true, on: :create end
Узнать больше
-
Callbacks, доступные для всего жизненного цикла (создание, сохранение, удаление, валидация и т. д.).class Person < ActiveRecord::Base before_destroy :invalidate_payment_plan # the `invalidate_payment_plan` method gets called just before Person#destroy end
Узнать больше
-
Inheritanceиерархии.class Company < ActiveRecord::Base; end class Firm < Company; end class Client < Company; end class PriorityClient < Client; end
Узнать больше
-
# Database transaction Account.transaction do david.withdrawal(100) mary.deposit(100) end
Узнать больше
-
Рефлексия столбцов, ассоциаций и агрегаций.
reflection = Firm.reflect_on_association(:clients) reflection.klass # => Client (class) Firm.columns # Returns an array of column descriptors for the firms table
Узнать больше
-
Абстракция базы данных с помощью простых адаптеров.
# connect to SQLite3 ActiveRecord::Base.establish_connection(adapter: 'sqlite3', database: 'dbfile.sqlite3') # connect to MySQL with authentication ActiveRecord::Base.establish_connection( adapter: 'mysql2', host: 'localhost', username: 'me', password: 'secret', database: 'activerecord' )
Узнать больше и прочитать о встроенной поддержке MySQL, PostgreSQL и SQLite3.
-
Поддержка логирования для Log4r и Logger.
ActiveRecord::Base.logger = ActiveSupport::Logger.new(STDOUT) ActiveRecord::Base.logger = Log4r::Logger.new('Application Log') -
Управление схемой, независимое от базы данных, с помощью Миграций.
class AddSystemSettings < ActiveRecord::Migration[7.1] def up create_table :system_settings do |t| t.string :name t.string :label t.text :value t.string :type t.integer :position end SystemSetting.create name: 'notice', label: 'Use notice?', value: 1 end def down drop_table :system_settings end endУзнать больше
Философия
Active Record — это реализация одноименного паттерна объектно-реляционного отображения (ORM), описанного Мартином Фаулером:
«Объект, который оборачивает строку в таблице или представлении базы данных, инкапсулирует доступ к базе данных и добавляет логику домена к этим данным».
Active Record пытается предоставить согласованную оболочку как решение неудобств, связанных с объектно-реляционным отображением. Основной целью этого отображения было минимизировать количество кода, необходимого для создания реальной модели домена. Это достигается за счет использования ряда соглашений, которые позволяют Active Record легко выводить сложные отношения и структуры из минимального количества явных указаний.
Соглашение важнее конфигурации:
-
Нет файлов XML!
-
Много рефлексии и расширения во время выполнения
-
Магия — это не обязательно плохое слово
Признать базу данных:
-
Позволяет перейти к SQL для особых случаев и повышения производительности
-
Не пытается дублировать или заменять определения данных
Загрузка и установка
Последнюю версию Active Record можно установить с помощью RubyGems:
$ gem install activerecord
Исходный код можно загрузить в рамках проекта Rails на GitHub:
Лицензия
Active Record распространяется по лицензии MIT:
Поддержка
Документация API находится по адресу:
Сообщения об ошибках для проекта Ruby on Rails можно отправить здесь:
Запросы на новые функции следует обсуждать на почтовой рассылке rails-core по этому адресу:
Константы
- MigrationProxy
-
MigrationProxyиспользуется для отложенной загрузки фактических классов миграции до тех пор, пока они не понадобятся - Point
- UnknownAttributeError
-
Ошибка Active Model UnknownAttributeError
Выбрасывается, когда неизвестные атрибуты предоставляются через массивное назначение.
class Person include ActiveModel::AttributeAssignment include ActiveModel::Validations end person = Person.new person.assign_attributes(name: 'Gorby') # => ActiveModel::UnknownAttributeError: unknown attribute 'name' for Person.
Атрибуты
Методы публичного класса
# File activerecord/lib/active_record.rb, line 211
def self.db_warnings_action=(action)
@db_warnings_action =
case action
when :ignore
nil
when :log
->(warning) do
warning_message = "[#{warning.class}] #{warning.message}"
warning_message += " (#{warning.code})" if warning.code
ActiveRecord::Base.logger.warn(warning_message)
end
when :raise
->(warning) { raise warning }
when :report
->(warning) { Rails.error.report(warning, handled: true) }
when Proc
action
else
raise ArgumentError, "db_warnings_action must be one of :ignore, :log, :raise, :report, or a custom proc."
end
end # File activerecord/lib/active_record.rb, line 196
def self.default_timezone=(default_timezone)
unless %i(local utc).include?(default_timezone)
raise ArgumentError, "default_timezone must be either :utc (default) or :local."
end
@default_timezone = default_timezone
end Определяет, использовать ли Time.utc (:utc) или Time.local (:local) при извлечении дат и времени из базы данных. По умолчанию установлено значение :utc.
# File activerecord/lib/active_record.rb, line 476 def self.disconnect_all! ConnectionAdapters::PoolConfig.disconnect_all! end
Явно закрывает все соединения с базой данных во всех пулах.
# File activerecord/lib/active_record.rb, line 465 def self.eager_load! super ActiveRecord::Locking.eager_load! ActiveRecord::Scoping.eager_load! ActiveRecord::Associations.eager_load! ActiveRecord::AttributeMethods.eager_load! ActiveRecord::ConnectionAdapters.eager_load! ActiveRecord::Encryption.eager_load! end
# File activerecord/lib/active_record/gem_version.rb, line 5 def self.gem_version Gem::Version.new VERSION::STRING end
Возвращает текущую загруженную версию Active Record в виде Gem::Version.
# File activerecord/lib/active_record.rb, line 278
def self.global_executor_concurrency=(global_executor_concurrency)
if self.async_query_executor.nil? || self.async_query_executor == :multi_thread_pool
raise ArgumentError, "`global_executor_concurrency` cannot be set when using the executor is nil or set to multi_thead_pool. For multiple thread pools, please set the concurrency in your database configuration."
end
@global_executor_concurrency = global_executor_concurrency
end Установить global_executor_concurrency. Это значение конфигурации может использоваться только с глобальным пулом потоков async query executor.
# File activerecord/lib/active_record.rb, line 245
def self.legacy_connection_handling=(_)
raise ArgumentError, <<~MSG.squish
The `legacy_connection_handling` setter was deprecated in 7.0 and removed in 7.1,
but is still defined in your configuration. Please remove this call as it no longer
has any effect."
MSG
end # File activerecord/lib/active_record.rb, line 457 def self.marshalling_format_version Marshalling.format_version end
# File activerecord/lib/active_record.rb, line 461 def self.marshalling_format_version=(value) Marshalling.format_version = value end
# File activerecord/lib/active_record.rb, line 395
def self.suppress_multiple_database_warning
ActiveRecord.deprecator.warn(<<-MSG.squish)
config.active_record.suppress_multiple_database_warning is deprecated and will be removed in Rails 7.2.
It no longer has any effect and should be removed from the configuration file.
MSG
end # File activerecord/lib/active_record.rb, line 402
def self.suppress_multiple_database_warning=(value)
ActiveRecord.deprecator.warn(<<-MSG.squish)
config.active_record.suppress_multiple_database_warning= is deprecated and will be removed in Rails 7.2.
It no longer has any effect and should be removed from the configuration file.
MSG
end # File activerecord/lib/active_record.rb, line 298 singleton_class.attr_accessor :verbose_query_logs
Указывает, должны ли методы вызова запросов к базе данных регистрироваться ниже соответствующих запросов. По умолчанию значение false.
# File activerecord/lib/active_record/version.rb, line 7 def self.version gem_version end
Возвращает текущую загруженную версию Active Record в виде Gem::Version.
© 2004–2021 David Heinemeier Hansson
Licensed under the MIT License.