Dec 06

ActiveRecord, general info

ActiveRecord - это руби библиотека, взаимодействующая с реляционными базами данных.

Она обеспечивает объектно-реляционное сопоставление (Object Relational Mapping) с этими основными функциями:

  • каждая сущность сопоставляется определенной таблице в БД;
  • доступ к колонкам в БД предоставляется посредством методов, наследуемых от схемы БД;
  • определены методы CRUD;
  • предоставляется DSL для составления SQL запросов;

Что такое Active Record?

Active Record это M в MVC - модель - которая является слоем в системе, ответственным за представление бизнес-логики и данных. Active Record упрощает создание и использование бизнес-объектов, данные которых требуют постоянного хранения в базе данных. Сама по себе эта реализация паттерна Active Record является описанием системы ORM (Object Relational Mapping)

Паттерн Active Record

Active Record был описан Martin Fowler в его книге Patterns of Enterprise Application Architecture. В Active Record объекты содержат и сохраненные данные, и поведение, которое работает с этими данными. Active Record исходит из мнения, что обеспечение логики доступа к данным как части объекта покажет пользователям этого объекта то, как читать и писать в базу данных.

Object Relational Mapping (ORM)

Object Relational Mapping, обычно упоминающееся как аббревиатура ORM, это техника, соединяющая сложные объекты приложения с таблицами в системе управления реляционными базами данных. С использованием ORM, свойства и взаимоотношения этих объектов приложения могут быть с легкостью сохранены и получены из базы данных без непосредственного написания выражений SQL, и, в итоге, с меньшим суммарным кодом для доступа в базу данных.

Active Record это фреймворк ORM

Active Record предоставляет нам несколько механизмов, наиболее важными из которых является способности для:

  • Представления моделей и их данных.
  • Представления связей между этими моделями.
  • Представления иерархий наследования с помощью связанных моделей.
  • Валидации моделей до того, как они будут сохранены в базу данных.
  • Выполнения операций с базой данных в объектно-ориентированном стиле.

Создание моделей Active Record

Создавать модели Active Record очень просто. Все, что необходимо сделать, - это создать подкласс ApplicationRecord, и готово:

class Product < ApplicationRecord  # ActiveRecord::Base до Rails 5.0
end

Это создаст модель Product, связав ее с таблицей products в базе данных. Сделав так, также появится способность связать столбцы каждой строки этой таблицы с атрибутами экземпляров вашей модели. Допустим, что таблица products была создана с использованием такого выражения SQL:

CREATE TABLE products (
   id int(11) NOT NULL auto_increment,
   name varchar(255),
   PRIMARY KEY  (id)
);

Следуя вышеуказанной схеме, можно будет писать подобный код:

p = Product.new
p.name = "Some Book"
puts p.name # "Some Book"

Переопределение соглашений о именовании

Но что, если вы следуете другому соглашению по именованию или используете новое приложение Rails со старой базой данных? Не проблема, можно просто переопределить соглашения по умолчанию.
ApplicationRecord наследуется от ActiveRecord::Base, который определяет ряд полезных методов. Можно использовать методActiveRecord::Base.table_name= для указания имени таблицы, которая должна быть использована:

class Product < ApplicationRecord  # ActiveRecord::Base до Rails 5.0
  self.table_name = "my_products"
end

Если так сделать, нужно вручную определить имя класса, содержащего фикстуры (my_products.yml), используя метод set_fixture_class в определении теста:

class ProductTest < ActiveSupport::TestCase
  set_fixture_class my_products: Product
  fixtures :my_products
  ...
end

Также возможно переопределить столбец, который должен быть использован как первичный ключ таблицы, с помощью методаActiveRecord::Base.primary_key=:

class Product < ApplicationRecord  # ActiveRecord::Base до Rails 5.0
  self.primary_key = "product_id"
end

CRUD: Чтение и запись данных

CRUD это сокращение для четырех глаголов, используемых для описания операций с данными: Create (создать), Read (прочесть), Update (обновить) и Delete (удалить). Active Record автоматически создает методы, позволяющие приложению читать и воздействовать на данные, хранимые в своих таблицах.

Валидации

Active Record позволяет проверять состояние модели до того, как она будет записана в базу данных. Имеется несколько методов, которые могут быть использованы для проверки ваших моделей и валидации, что значение атрибута не пустое, уникальное (не существующее в базе данных), отвечает определенному формату, и многие другие.
Валидация - это очень важный вопрос, который нужно рассмотреть при сохранении в базу данных, поэтому методы save и update учитывают ее при запуске: они возвращают false, когда валидация проваливается, и фактически они не выполняют каких-либо операций с базой данных. Каждый из этих методов имеет пару с восклицательным знаком (save! и update!), которые строже в том, что они вызывают исключениеActiveRecord::RecordInvalid если валидация провалится. Краткий пример:

class User < ApplicationRecord  # ActiveRecord::Base до Rails 5.0
  validates :name, presence: true
end
 
user = User.new
user.save  # => false
user.save! # => ActiveRecord::RecordInvalid: Validation failed: Name can't be blank

Колбэки

Колбэки Active Record разрешают присоединить код к определенным событиям в жизненном цикле ваших моделей. Это позволяет добавить поведение модели, прозрачно запустив код, когда эти события произойдут, например, когда вы создадите новую запись, обновите его, удалите его и так далее. Подробнее о колбэках можно прочитать в посте по колбэкам Active Record.

Миграции

Rails представляет DSL для управления схемой базы данных, называемый миграциями. Миграции хранятся в файлах, запускаемых для любой базы данных, которую поддерживает Active Record, с использованием rake. Вот миграция, создающая таблицу:

class CreatePublications < ActiveRecord::Migration[5.0] # ActiveRecord::Migration до Rails 5.0
  def change
    create_table :publications do |t|
      t.string :title
      t.text :description
      t.references :publication_type
      t.integer :publisher_id
      t.string :publisher_type
      t.boolean :single_issue
 
      t.timestamps null: false
    end
    add_index :publications, :publication_type_id
  end
end

Rails отслеживает, какие файлы переданы в базу данных, и представляет возможность отката. Чтобы фактически создать таблицу, нужно запустить rails db:migrate, а чтобы ее откатить rails db:rollback.
Отметьте, что вышеприведенный код не зависит от базы данных: он выполнится, например: в MySQL, PostgreSQL, Oracle.

Share:

Comments

comments powered by HyperComments
Comment