К основному содержанию
скилл CX Codex

ecto-patterns — скилл для Claude Code: паттерны Ecto в Phoenix

Скилл подсказывает агенту, как писать схемы, changesets, миграции и транзакции в Ecto для Phoenix-приложений на Elixir.

Установить в Claude Code · Через Skills CLI (Vercel) Все способы и платформы ↓
npx skills add bobmatnyc/claude-mpm-skills --skill ecto-patterns -a claude-code
Открыть на GitHub

Что делает ecto-patterns

Скилл закрывает весь слой данных Phoenix: схемы и changesets с валидацией, миграции, запросы с preload, Ecto.Multi, ограничения на уровне базы, пагинацию, мультитенантность и тесты. Внутри — готовые примеры кода и правила, которые агент подставляет, когда вы просите что-то сделать с Ecto.

Правила простые: валидация живёт в changesets, бизнес-логика — в контекстах, а каждая валидация дублируется ограничением в базе (unique_constraint, foreign_key_constraint). Для многошаговых записей скилл советует Repo.transaction или Ecto.Multi, для больших таблиц — индексы с concurrently: true и разбиение миграций на мелкие шаги.

Отдельный блок про грабли: рискованный DDL в одном шаге, запросы к ассоциациям в цикле вместо preload, отсутствие транзакции на многошаговой записи. Если в проекте мультитенантность на префиксах Postgres, помните: каждому тенанту нужны свои миграции, и это повод проверить, как у вас устроен деплой.

Какие задачи решает

  • описать схему и changeset с валидацией полей
  • провести миграцию без блокировки большой таблицы
  • собрать многошаговую запись через Ecto.Multi
  • убрать N+1 при рендере списка
  • развести данные арендаторов по префиксам Postgres

Примеры запросов агенту

  • добавь схему User и changeset для регистрации с проверкой email
  • перепиши этот многошаговый insert на Ecto.Multi
  • почему здесь N+1 и как починить через preload

Как установить ecto-patterns

1Через Skills CLI (Vercel)

npx skills add bobmatnyc/claude-mpm-skills --skill ecto-patterns -a claude-code

2Вручную: положить файлы

~/.claude/skills/ecto-patterns/SKILL.md

Папка скилла целиком; для одного проекта — .claude/skills/ecto-patterns/

По шагам, с командами для каждой платформы: Как установить скилл в Claude Code: пять способов

Из того же набора65

vercel-networking-domains Скилл для настройки доменов, редиректов, rewrites, заголовков и edge-кеша на Vercel. Пригодится, когда правишь поведение трафика, а не код приложения. CX Codex +1 344установок svelte Скилл помогает писать интерфейсы на Svelte 5 и приложения на SvelteKit. Пригодится для реактивного состояния, компонентов и серверного или статического рендеринга. CX Codex +1 343установок env-manager Проверяет .env, ищет секреты в клиентских переменных и сравнивает файл с .env.example. Пригодится перед деплоем и при онбординге. CX Codex +1 340установок phoenix-api-channels Скилл для Claude, который ведёт агента по Phoenix: JSON-контроллеры, контексты Ecto, Channels и Presence на BEAM. CX Codex +1 339установок media-transcoding Скилл для пакетной перекодировки видео по готовым пресетам FFmpeg: веб, мобильные, архив. Пригодится, когда надо привести библиотеку роликов к одному формату. CX Codex +1 335установок phoenix-ops Скилл для подготовки Phoenix-приложения к продакшену: релизы, runtime-конфиг, кластеризация, телеметрия и защита эндпоинтов. CX Codex +1 331установок pre-merge Скилл-чеклист, который прогоняет типы, линтер и тесты до коммита, до PR и до мержа в main. Пригодится, когда не хочется ловить поломки уже в ревью. CX Codex +1 330установок vb6-legacy Скилл для работы с классическим VB6: подсказывает, как переносить код в VB.NET и вызывать COM-объекты без утечек памяти. CX Codex +1 329установок

Похожие

phoenix Mindrally Задаёт агенту правила кода на Elixir и Phoenix: LiveView, Ecto, контексты, тесты. Пригодится, когда проект уже на Phoenix и нужен предсказуемый стиль. CX Codex +1 722установок elixir Mindrally Скилл задаёт агенту стиль работы с Elixir и Phoenix: функциональные паттерны, Ecto, LiveView, OTP. Пригодится, когда проект на BEAM, а не на чём-то ещё. CX Codex +1 836установок elixir-expert VoltAgent Community Разбирает архитектуру Elixir-проекта и помогает менять код с опорой на OTP, Phoenix и Ecto. Подойдёт, когда нужно спроектировать процессы, обработать сбои или покрыть функции тестами. 167установок postgres-patterns affaan-m Шпаргалка по лучшим практикам PostgreSQL на базе Supabase: выбор индексов, типов данных, оптимизация RLS и поиск медленных запросов. CX Codex +1 5 200установок prisma-patterns affaan-m Набор правил и архитектурных шаблонов для работы с Prisma ORM в TypeScript. Помогает писать безопасные схемы, запросы и транзакции без утечек соединений. CX Codex +1 4 500установок database-management-patterns manutej Скилл-справочник по работе с PostgreSQL и MongoDB: проектирование схем, индексы, транзакции, репликация и шардирование. CX Codex +1 466установок

Рядом в теме «Данные и базы»

Все скиллы по теме «Данные и базы» →

Вопросы о ecto-patterns

Как установить ecto-patterns в Claude?

Выполните npx skills add bobmatnyc/claude-mpm-skills --skill ecto-patterns -a claude-code. Файл скилла окажется в ~/.claude/skills/ecto-patterns/SKILL.md.

Что делает ecto-patterns?

Даёт агенту набор паттернов Ecto: схемы, changesets, миграции, запросы, транзакции, ограничения, пагинация, мультитенантность и тесты. Работает как справочник, который подтягивается при задачах на слой данных.

Для каких платформ подходит скилл?

Кроме Claude есть установка для Codex, Cursor, GitHub Copilot, Gemini CLI и OpenCode. Для каждой платформы своя команда и свой путь к SKILL.md.

Исходный текст

SKILL.md · MIT
---
name: ecto-patterns
description: Ecto patterns for Phoenix/Elixir apps. Covers schemas, changesets, migrations, queries, Ecto.Multi, transactions, constraints, associations, pagination, tenant partitioning, performance, and testing.
user-invocable: false
disable-model-invocation: true
version: 1.0.0
category: toolchain
author: Claude MPM Team
license: MIT
progressive_disclosure:
  entry_point:
    summary: "Ecto schemas/changesets, migrations, queries, transactions, constraints, pagination, tenancy, and performance for Phoenix apps."
    when_to_use:
      - "Designing schemas and changesets with validation/constraints"
      - "Running migrations safely (DDL ordering, locks) and managing data migrations"
      - "Executing transactional flows with Ecto.Multi"
      - "Implementing pagination, preloading, and multi-tenant partitioning"
    quick_start:
      - "mix ecto.create && mix ecto.migrate"
      - "Define schemas + changesets; enforce DB constraints (unique/foreign keys)"
      - "Use Repo.transaction / Ecto.Multi for multi-step writes"
      - "Preload associations; paginate with limit/offset or cursor libs (Scrivener/Flop)"
  token_estimate:
    entry: 170
    full: 5400
---

# Ecto Patterns for Phoenix/Elixir

Ecto is the data layer for Phoenix applications: schemas, changesets, queries, migrations, and transactions. Good Ecto practice keeps domain logic in contexts, enforces constraints in the database, and uses transactions for multi-step workflows.

## Schemas and Changesets

```elixir
defmodule MyApp.Accounts.User do
  use Ecto.Schema
  import Ecto.Changeset

  schema "users" do
    field :email, :string
    field :hashed_password, :string
    field :confirmed_at, :naive_datetime
    has_many :memberships, MyApp.Orgs.Membership
    timestamps()
  end

  def registration_changeset(user, attrs) do
    user
    |> cast(attrs, [:email, :password])
    |> validate_required([:email, :password])
    |> validate_format(:email, ~r/@/)
    |> validate_length(:password, min: 12)
    |> unique_constraint(:email)
    |> hash_password()
  end

  defp hash_password(%{valid?: true} = cs),
    do: put_change(cs, :hashed_password, Argon2.hash_pwd_salt(get_change(cs, :password)))
  defp hash_password(cs), do: cs
end
```

**Guidelines**
- Keep casting/validation in changesets; keep business logic in contexts.
- Always pair validation with DB constraints (`unique_constraint`, `foreign_key_constraint`).
- Use `changeset/2` for updates; avoid mass assigning without casting.

## Migrations

```elixir
def change do
  create table(:users) do
    add :email, :citext, null: false
    add :hashed_password, :string, null: false
    add :confirmed_at, :naive_datetime
    timestamps()
  end

  create unique_index(:users, [:email])
end
```

**Safe migration tips**
- Prefer additive changes: add columns nullable, backfill, then enforce null: false.
- For large tables: use `concurrently: true` for indexes; disable in `change` and wrap in `up/down` for Postgres.
- Data migrations belong in separate modules called from `mix ecto.migrate` via `execute/1` or in distinct scripts; ensure idempotence.
- Coordinate locks: avoid long transactions; break migrations into small steps.

## Queries and Preloads

```elixir
import Ecto.Query

def list_users(opts \\ %{}) do
  base =
    from u in MyApp.Accounts.User,
      preload: [:memberships],
      order_by: [desc: u.inserted_at]

  Repo.all(apply_pagination(base, opts))
end

defp apply_pagination(query, %{limit: limit, offset: offset}),
  do: query |> limit(^limit) |> offset(^offset)
defp apply_pagination(query, _), do: query
```

**Patterns**
- Use `preload` rather than calling Repo in loops; prefer `Repo.preload/2` after fetching.
- Use `select` to avoid loading large blobs.
- For concurrency, use `Repo.transaction` with `lock: "FOR UPDATE"` in queries that need row-level locks.

## Transactions and Ecto.Multi

```elixir
alias Ecto.Multi

def onboard_user(attrs) do
  Multi.new()
  |> Multi.insert(:user, User.registration_changeset(%User{}, attrs))
  |> Multi.insert(:org, fn %{user: user} ->
    Org.changeset(%Org{}, %{owner_id: user.id, name: attrs["org_name"]})
  end)
  |> Multi.run(:welcome, fn _repo, %{user: user} ->
    MyApp.Mailer.deliver_welcome(user)
    {:ok, :sent}
  end)
  |> Repo.transaction()
end
```

**Guidelines**
- Prefer `Multi.run/3` for side effects that can fail; return `{:ok, value}` or `{:error, reason}`.
- Use `Multi.update_all` for batch updates; include `where` guards to prevent unbounded writes.
- Propagate errors upward; translate them in controllers/LiveViews.

## Associations and Constraints

- Use `on_replace: :delete`/`:nilify` to control nested changes.
- Define `foreign_key_constraint/3` and `unique_constraint/3` in changesets to surface DB errors cleanly.
- For many-to-many, prefer join schema (`has_many :memberships`) instead of automatic `many_to_many` when you need metadata.

## Pagination and Filtering

- Offset/limit for small datasets; cursor-based for large lists (`Scrivener`, `Flop`, `Paginator`).
- Normalize filters in contexts; avoid letting controllers build queries directly.
- Add composite indexes to match filter columns; verify with `EXPLAIN ANALYZE`.

## Multi-Tenancy Patterns

- **Prefix-based**: Postgres schemas per tenant (`put_source/2` with `prefix:`) — good isolation, needs per-tenant migrations.
- **Row-based**: `tenant_id` column + row filters — simpler migrations; add partial indexes per tenant when large.
- Always scope queries by tenant in contexts; consider using policies/guards to enforce.

## Performance and Ops

- Use `Repo.stream` for large exports; wrap in `Repo.transaction`.
- Cache hot reads with ETS/Cachex; invalidate on writes.
- Watch query counts in LiveView/Channels; preload before rendering to avoid N+1.
- Telemetry: `OpentelemetryEcto` exports query timings; add DB connection pool metrics.

## Testing

```elixir
use MyApp.DataCase, async: true

test "registration changeset validates email" do
  changeset = User.registration_changeset(%User{}, %{email: "bad", password: "secretsecret"})
  refute changeset.valid?
  assert %{email: ["has invalid format"]} = errors_on(changeset)
end
```

- `DataCase` sets up sandboxed DB; keep tests async unless transactions conflict.
- Use factories/fixtures in `test/support` to build valid structs quickly.
- For migrations, add regression tests for constraints (unique/index-backed constraints).

## Common Pitfalls

- Running risky DDL in a single migration step (avoid locks; break apart).
- Skipping DB constraints and relying only on changesets.
- Querying associations in loops instead of preloading.
- Missing transactions for multi-step writes (partial state on failure).
- Forgetting tenant scoping on read/write in multi-tenant setups.

© Claude MPM Team · MIT · bobmatnyc/claude-mpm-skills

Смотрите также

Спонсоры проекта

Компании, которые помогают держать аналитику открытой