Код IT
← Каталог

Работа с базами данных из Ruby — Scope

Фрагмент из «Работа с базами данных из Ruby»: Scope.

Ruby main.rb

Разбор:
- Фрагмент показывает конкретный сценарий, который стартует со строки `Теперь `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('Тимур')