Spec-Zone.ru › Ruby on Rails 7.1

модуль ActiveRecord

Включенные модули:
ActiveSupport::Deprecation::DeprecatedConstantAccessor

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
    

    Узнать больше

  • Transactions.

    # 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:

  • github.com/rails/rails/tree/main/activerecord

Лицензия

Active Record распространяется по лицензии MIT:

  • opensource.org/licenses/MIT

Поддержка

Документация API находится по адресу:

  • api.rubyonrails.org

Сообщения об ошибках для проекта Ruby on Rails можно отправить здесь:

  • github.com/rails/rails/issues

Запросы на новые функции следует обсуждать на почтовой рассылке rails-core по этому адресу:

  • discuss.rubyonrails.org/c/rubyonrails-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.

Атрибуты

application_record_class[RW]
async_query_executor[RW]
before_committed_on_all_records[RW]
belongs_to_required_validates_foreign_key[RW]
commit_transaction_on_non_local_return[RW]
db_warnings_action[R]
db_warnings_ignore[RW]
default_timezone[R]
disable_prepared_statements[RW]
index_nested_attribute_errors[RW]
lazily_load_schema_cache[RW]
maintain_test_schema[RW]
query_transformers[RW]
raise_on_assign_to_attr_readonly[RW]
reading_role[RW]
run_after_transaction_callbacks_in_order_defined[RW]
schema_cache_ignored_tables[RW]
writing_role[RW]

Методы публичного класса

db_warnings_action=(action) Показать исходный код
# 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
default_timezone=(default_timezone) Показать исходный код
# 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.

disconnect_all!() Показать исходный код
# File activerecord/lib/active_record.rb, line 476
def self.disconnect_all!
  ConnectionAdapters::PoolConfig.disconnect_all!
end

Явно закрывает все соединения с базой данных во всех пулах.

eager_load!() Показать исходный код
# 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
Вызов метода суперкласса
gem_version() Показать исходный код
# File activerecord/lib/active_record/gem_version.rb, line 5
def self.gem_version
  Gem::Version.new VERSION::STRING
end

Возвращает текущую загруженную версию Active Record в виде Gem::Version.

global_executor_concurrency=(global_executor_concurrency) Показать исходный код
# 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.

legacy_connection_handling=(_) Показать исходный код
# 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
marshalling_format_version() Показать исходный код
# File activerecord/lib/active_record.rb, line 457
def self.marshalling_format_version
  Marshalling.format_version
end
marshalling_format_version=(value) Показать исходный код
# File activerecord/lib/active_record.rb, line 461
def self.marshalling_format_version=(value)
  Marshalling.format_version = value
end
suppress_multiple_database_warning() Показать исходный код
# 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
suppress_multiple_database_warning=(value) Показать исходный код
# 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
unknown() Показать исходный код
# File activerecord/lib/active_record.rb, line 298
singleton_class.attr_accessor :verbose_query_logs

Указывает, должны ли методы вызова запросов к базе данных регистрироваться ниже соответствующих запросов. По умолчанию значение false.

version() Показать исходный код
# 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.

Spec-Zone.ru

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