Разбор:
- Фрагмент показывает конкретный сценарий, который стартует со строки `Теперь `product.price` — объект `Money`, а в БД хранится `INTEGER`. Преимущества:` и задаёт контекст выполнения.
- Ключевые элементы блока: `product`, `price`, `Money`, `INTEGER`, `Scope`, они определяют основную логику примера.
- По шагам код выполняется так: `Теперь `product.price` — объект `Money`, а в БД хранится `INTEGER`. ` -> `- вынос логики преобразования из модели;` -> `- переиспользование типа в разных моделях;` -> `- поддержка валидаций и сериализации.`.
- Практически важно добавить обработку ошибок и явные проверки входа, чтобы исключить скрытые падения в рантайме.
- Типичная ошибка при развитии такого кода — смешивать бизнес-правила и инфраструктурные детали в одном месте; лучше разделять ответственность.
class User < ActiveRecord::Base
scope :active, -> { where(active: true) }
scope :by_name, ->(name) { where('name ILIKE ?', "%#{name}%") }
end
User.active.by_name('Тимур')
Разбор:
- Фрагмент показывает конкретный сценарий, который стартует со строки `Теперь `product.price` — объект `Money`, а в БД хранится `INTEGER`. Преимущества:` и задаёт контекст выполнения.
- Ключевые элементы блока: `product`, `price`, `Money`, `INTEGER`, `Scope`, они определяют основную логику примера.
- По шагам код выполняется так: `Теперь `product.price` — объект `Money`, а в БД хранится `INTEGER`. ` -> `- вынос логики преобразования из модели;` -> `- переиспользование типа в разных моделях;` -> `- поддержка валидаций и сериализации.`.
- Практически важно добавить обработку ошибок и явные проверки входа, чтобы исключить скрытые падения в рантайме.
- Типичная ошибка при развитии такого кода — смешивать бизнес-правила и инфраструктурные детали в одном месте; лучше разделять ответственность.
class User < ActiveRecord::Base
scope :active, -> { where(active: true) }
scope :by_name, ->(name) { where('name ILIKE ?', "%#{name}%") }
end
User.active.by_name('Тимур')