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

Работа с базами данных из Ruby — Миграции — управление схемой как код

Фрагмент из «Работа с базами данных из Ruby»: Миграции — управление схемой как код.

Ruby main.rb

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