← ClaudeAtlas

ecto-thinkinglisted

This skill should be used when the user asks to "add a database table", "create a new context", "query the database", "add a field to a schema", "validate form input", "fix N+1 queries", "preload this association", "separate these concerns", or mentions Repo, changesets, migrations, Ecto.Multi, has_many, belongs_to, transactions, query composition, or how contexts should talk to each other.
ahmedxx99/claude-code-elixir · ★ 2 · API & Backend · score 75
Install: claude install-skill ahmedxx99/claude-code-elixir
# Ecto Thinking Mental shifts for Ecto and data layer design. These insights challenge typical ORM patterns. ## Context = Setting That Changes Meaning Context isn't just a namespace—it changes what words mean. "Product" means different things in Checkout (SKU, name), Billing (SKU, cost), and Fulfillment (SKU, warehouse). Each bounded context may have its OWN Product schema/table. **Think top-down:** Subdomain → Context → Entity. Not "What context does Product belong to?" but "What is a Product in this business domain?" ## Cross-Context References: IDs, Not Associations ```elixir schema "cart_items" do field :product_id, :integer # Reference by ID # NOT: belongs_to :product, Catalog.Product end ``` Query through the context, not across associations. Keeps contexts independent and testable. ## DDD Patterns as Pipelines ```elixir def create_product(params) do params |> Products.build() # Factory: unstructured → domain |> Products.validate() # Aggregate: enforce invariants |> Products.insert() # Repository: persist end ``` Use events (as data structs) to compose bounded contexts with minimal coupling. ## Schema ≠ Database Table | Use Case | Approach | |----------|----------| | Database table | Standard `schema/2` | | Form validation only | `embedded_schema/1` | | API request/response | Embedded schema or schemaless | ## Multiple Changesets per Schema ```elixir def registration_changeset(user, attrs) # Full validation + password def profil