Разбор:
- Фрагмент показывает конкретный сценарий, который стартует со строки `- При первом обращении к `user.posts` происходит **ленивая загрузка** (lazy loading) — зап` и задаёт контекст выполнения.
- Ключевые элементы блока: `join`, `SELECT`, `includes`, они определяют основную логику примера.
- По шагам код выполняется так: `- При первом обращении к `user.posts` происходит **ленивая загрузка*` -> `**Проблема N+1**:` -> `Если в цикле `@users.each { |u| puts u.posts.count }` — для каждого ` -> `---`.
- Для производительности важны индексы по условиям выборки, проверка плана выполнения и контроль N+1 при связях.
- Типичная ошибка при развитии такого кода — смешивать бизнес-правила и инфраструктурные детали в одном месте; лучше разделять ответственность.
class CreateUsers < ActiveRecord::Migration[7.0]
def change
create_table :users do |t|
t.string :name, null: false
t.string :email, index: { unique: true }
t.timestamps
end
end
end
Разбор:
- Фрагмент показывает конкретный сценарий, который стартует со строки `- При первом обращении к `user.posts` происходит **ленивая загрузка** (lazy loading) — зап` и задаёт контекст выполнения.
- Ключевые элементы блока: `join`, `SELECT`, `includes`, они определяют основную логику примера.
- По шагам код выполняется так: `- При первом обращении к `user.posts` происходит **ленивая загрузка*` -> `**Проблема N+1**:` -> `Если в цикле `@users.each { |u| puts u.posts.count }` — для каждого ` -> `---`.
- Для производительности важны индексы по условиям выборки, проверка плана выполнения и контроль N+1 при связях.
- Типичная ошибка при развитии такого кода — смешивать бизнес-правила и инфраструктурные детали в одном месте; лучше разделять ответственность.
class CreateUsers < ActiveRecord::Migration[7.0]
def change
create_table :users do |t|
t.string :name, null: false
t.string :email, index: { unique: true }
t.timestamps
end
end
end