From cd565a826c5219f827c2bce25036f8f11521c689 Mon Sep 17 00:00:00 2001 From: Josef Diago Date: Fri, 13 Feb 2026 13:07:04 -0500 Subject: [PATCH 1/4] Updates many-to-many guide --- guides/cheatsheets/associations.cheatmd | 32 +++++++++++++++++++++++-- 1 file changed, 30 insertions(+), 2 deletions(-) diff --git a/guides/cheatsheets/associations.cheatmd b/guides/cheatsheets/associations.cheatmd index 4df0948354..98a37da521 100644 --- a/guides/cheatsheets/associations.cheatmd +++ b/guides/cheatsheets/associations.cheatmd @@ -196,8 +196,6 @@ end ### The migration -It applies to both join tables and schemas. - ```elixir defmodule MyApp.Migrations.CreateMoviesAndActors do use Ecto.Migration @@ -210,6 +208,36 @@ defmodule MyApp.Migrations.CreateMoviesAndActors do create table("actors") do timestamps() end + end +end +``` + +#### Without a join schema, the join table can only have the foreign keys + +```elixir +defmodule MyApp.Migrations.CreateJoinTable do + use Ecto.Migration + + create table("movies_actors", primary_key: false) do + add :movie_id, + references(:movies, on_delete: :delete_all), + null: false + + add :actor_id, + references(:actors, on_delete: :delete_all), + null: false + end + + create unique_index(:movies_actors, [:movie_id, :actor_id]) + end +end +``` + +#### With a join schema, the join table can have other columns like timestamps + +```elixir +defmodule MyApp.Migrations.CreateJoinTable do + use Ecto.Migration create table("movies_actors", primary_key: false) do add :movie_id, From c8edcd38a04080e38095514066dfd97138632ace Mon Sep 17 00:00:00 2001 From: Josef Diago Date: Fri, 13 Feb 2026 13:24:07 -0500 Subject: [PATCH 2/4] Fixes code snippets --- guides/cheatsheets/associations.cheatmd | 42 ++++++++++++------------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/guides/cheatsheets/associations.cheatmd b/guides/cheatsheets/associations.cheatmd index 98a37da521..eb88324180 100644 --- a/guides/cheatsheets/associations.cheatmd +++ b/guides/cheatsheets/associations.cheatmd @@ -218,18 +218,17 @@ end defmodule MyApp.Migrations.CreateJoinTable do use Ecto.Migration - create table("movies_actors", primary_key: false) do - add :movie_id, - references(:movies, on_delete: :delete_all), - null: false - - add :actor_id, - references(:actors, on_delete: :delete_all), - null: false - end - - create unique_index(:movies_actors, [:movie_id, :actor_id]) + create table("movies_actors", primary_key: false) do + add :movie_id, + references(:movies, on_delete: :delete_all), + null: false + + add :actor_id, + references(:actors, on_delete: :delete_all), + null: false end + + create unique_index(:movies_actors, [:movie_id, :actor_id]) end ``` @@ -239,20 +238,19 @@ end defmodule MyApp.Migrations.CreateJoinTable do use Ecto.Migration - create table("movies_actors", primary_key: false) do - add :movie_id, - references(:movies, on_delete: :delete_all), - null: false - - add :actor_id, - references(:actors, on_delete: :delete_all), - null: false + create table("movies_actors", primary_key: false) do + add :movie_id, + references(:movies, on_delete: :delete_all), + null: false - timestamps() - end + add :actor_id, + references(:actors, on_delete: :delete_all), + null: false - create unique_index(:movies_actors, [:movie_id, :actor_id]) + timestamps() end + + create unique_index(:movies_actors, [:movie_id, :actor_id]) end ``` From 8e8738fd6b1f6ff50c1cc36a131e1241ca4baf26 Mon Sep 17 00:00:00 2001 From: Josef Diago Date: Fri, 13 Feb 2026 13:32:23 -0500 Subject: [PATCH 3/4] Forgot the change function --- guides/cheatsheets/associations.cheatmd | 48 +++++++++++++------------ 1 file changed, 26 insertions(+), 22 deletions(-) diff --git a/guides/cheatsheets/associations.cheatmd b/guides/cheatsheets/associations.cheatmd index eb88324180..276b8c0e5d 100644 --- a/guides/cheatsheets/associations.cheatmd +++ b/guides/cheatsheets/associations.cheatmd @@ -218,17 +218,19 @@ end defmodule MyApp.Migrations.CreateJoinTable do use Ecto.Migration - create table("movies_actors", primary_key: false) do - add :movie_id, - references(:movies, on_delete: :delete_all), - null: false - - add :actor_id, - references(:actors, on_delete: :delete_all), - null: false + def change do + create table("movies_actors", primary_key: false) do + add :movie_id, + references(:movies, on_delete: :delete_all), + null: false + + add :actor_id, + references(:actors, on_delete: :delete_all), + null: false + end + + create unique_index(:movies_actors, [:movie_id, :actor_id]) end - - create unique_index(:movies_actors, [:movie_id, :actor_id]) end ``` @@ -238,19 +240,21 @@ end defmodule MyApp.Migrations.CreateJoinTable do use Ecto.Migration - create table("movies_actors", primary_key: false) do - add :movie_id, - references(:movies, on_delete: :delete_all), - null: false - - add :actor_id, - references(:actors, on_delete: :delete_all), - null: false - - timestamps() + def change do + create table("movies_actors", primary_key: false) do + add :movie_id, + references(:movies, on_delete: :delete_all), + null: false + + add :actor_id, + references(:actors, on_delete: :delete_all), + null: false + + timestamps() + end + + create unique_index(:movies_actors, [:movie_id, :actor_id]) end - - create unique_index(:movies_actors, [:movie_id, :actor_id]) end ``` From 3f7427ffcf4ee9dbc0c0d6d60ab3aa550ed01fd9 Mon Sep 17 00:00:00 2001 From: Josef Diago Date: Fri, 13 Feb 2026 13:35:39 -0500 Subject: [PATCH 4/4] trims trailing whitespace --- guides/cheatsheets/associations.cheatmd | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/guides/cheatsheets/associations.cheatmd b/guides/cheatsheets/associations.cheatmd index 276b8c0e5d..a73ecd9089 100644 --- a/guides/cheatsheets/associations.cheatmd +++ b/guides/cheatsheets/associations.cheatmd @@ -223,12 +223,12 @@ defmodule MyApp.Migrations.CreateJoinTable do add :movie_id, references(:movies, on_delete: :delete_all), null: false - + add :actor_id, references(:actors, on_delete: :delete_all), null: false end - + create unique_index(:movies_actors, [:movie_id, :actor_id]) end end @@ -245,14 +245,14 @@ defmodule MyApp.Migrations.CreateJoinTable do add :movie_id, references(:movies, on_delete: :delete_all), null: false - + add :actor_id, references(:actors, on_delete: :delete_all), null: false - + timestamps() end - + create unique_index(:movies_actors, [:movie_id, :actor_id]) end end