
В Rails 5 много нововведений, одним из них является ActiveRecord Attributes. Эта фича позволяет добавлять аттрибут в модель Rails и обработать его согласно указанному типу. Посмотрим насколько полезен этот новый функционал.
Рассмотрим пример. У нас есть модель пользователей - User. Миграция и сама модель описаны ниже.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Обратите внимание на колонку male, мы могли бы вполне сделать ее с типом boolean, но в данном примере это сделано специально,
чтобы показать как мы сможем использовать Attributes.
Хотя бывают и реальные случаи, когда изначально в архитектуре проекта был неверно выбран тип данных, и по прошествии времени, изменение типа будет болезненным.
Давайте воспользуемся нововведением. Укажем колонку male как аттрибут, с типом boolean
1 2 3 | |
Теперь мы можем использовать колонку так, как будто ее тип boolean, например:
1 2 3 4 5 6 7 8 9 10 11 | |
Вот так легко теперь можно решить проблему несовместимости типов данных указанных в таблице БД и требований согласно бизнес логике. ActiveRecord Attributes поддерживает основные типы данных, ниже список:
- :big_integer
- :binary
- :boolean
- :date
- :date_time
- :decimal
- :float
- :integer
- :string
- :text
- :time
Аттрибут не обязательно может быть колонкой в таблице, можно применять его и для обычных аттрибутов модели.
Добавим для модели User аттрибут confirmed_at, и укажем тип данных :date_time, и все будет корректно
обрабатываться. При этом мы не указываем аттрибут через attr_accessor.
1 2 3 4 5 6 7 8 9 10 11 12 13 | |
Свой обработчик ActiveRecord Attributes
Допустим у нас есть модель Transaction, и в поле цена, к нам приходит строка в виде $100,
а мы хотим сохранять в базу данных значение в центах, и цифрой, а также использовать строку в запросах.
Для решения этой задачи, нам необходимо добавить свой тип данных, и в этом Attributes нам поможет.
Создадим класс MoneyType, и напишем свой метод type_cast, который используется для преобразования данных.
1 2 3 4 5 6 7 8 9 10 | |
Укажем обработчик для колонки price
1 2 3 | |
Если все сделали верно, то теперь мы можем делать вот такие запросы, и быть уверенными что все отработает как надо
1 2 | |
Как видите очень удобно и просто. Возьмите на заметку :)