user model
defmodule App.Accounts.User do
use Ecto.Schema
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
alias App.{Accounts, Roles}
schema "users" do
field :username, :string
many_to_many :permissions, Roles.Permission, join_through: "users_permissions"
end
end
permission model
defmodule App.Roles.Permission do
use Ecto.Schema
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
alias App.{Accounts}
schema "permissions" do
field :action, :string
many_to_many :users, Accounts.User, join_through: "users_permissions"
end
end
users_permissions migration file
defmodule App.Repo.Migrations.AddUserPermissionManyToManyTable do
use Ecto.Migration
def change do
create table(:users_permissions, primary_key: false) do
add :id, :uuid, primary_key: true
add :user_id, references(:users, on_delete: :delete_all, type: :uuid), null: false
add :permission_id, references(:permissions, on_delete: :delete_all, type: :uuid), null: false
timestamps([{:updated_at, :false}])
end
create unique_index(:users_permissions, [:user_id, :permission_id])
end
end
seed file
# ...omit body
master_account =
%Accounts.User{}
|> Accounts.User.registration_changeset(%{...})
|> Repo.insert!()
|> Repo.preload(:permissions)
action_lists = ["register", ...]
Enum.each(action_lists, fn(action) ->
Ecto.Multi.new()
|> Ecto.Multi.insert(:permissions, %Roles.Permission{action: action})
|> Ecto.Multi.merge(&(
&1[:permissions]
|> Repo.preload(:users)
|> Ecto.Changeset.change()
|> Ecto.Changeset.put_assoc(:users, [master_account])
|> Repo.update()
))
|> Repo.transaction()
end)
console logs
** (Postgrex.Error) ERROR 23502 (not_null_violation): null value in column "id" violates not-null constraint
table: users_permissions
column: id
Failing row contains (null, 692a0877-6b7d-4e32-a2ce-1c48ffd86064, f0f27bc1-b0be-45af-8686-439a7500a351, null).
(ecto) lib/ecto/adapters/sql.ex:200: Ecto.Adapters.SQL.query!/5
(ecto) lib/ecto/adapters/postgres.ex:96: Ecto.Adapters.Postgres.insert_all/7
(ecto) lib/ecto/repo/schema.ex:52: Ecto.Repo.Schema.do_insert_all/7
(ecto) lib/ecto/association.ex:1031: Ecto.Association.ManyToMany.on_repo_change/4
(ecto) lib/ecto/association.ex:338: anonymous fn/7 in Ecto.Association.on_repo_change/6
(elixir) lib/enum.ex:1899: Enum."-reduce/3-lists^foldl/2-0-"/3
(ecto) lib/ecto/association.ex:335: Ecto.Association.on_repo_change/6
(elixir) lib/enum.ex:1899: Enum."-reduce/3-lists^foldl/2-0-"/3
(ecto) lib/ecto/association.ex:301: Ecto.Association.on_repo_change/3
(ecto) lib/ecto/repo/schema.ex:708: Ecto.Repo.Schema.process_children/4
(ecto) lib/ecto/repo/schema.ex:774: anonymous fn/3 in Ecto.Repo.Schema.wrap_in_transaction/6
(db_connection) lib/db_connection.ex:1374: DBConnection.transaction_nested/2
(db_connection) lib/db_connection.ex:1234: DBConnection.transaction_meter/3
(db_connection) lib/db_connection.ex:798: DBConnection.transaction/3
(ecto) lib/ecto/multi.ex:447: Ecto.Multi.apply_operation/4
(ecto) lib/ecto/multi.ex:421: Ecto.Multi.apply_operation/5
(elixir) lib/enum.ex:1899: Enum."-reduce/3-lists^foldl/2-0-"/3
(ecto) lib/ecto/multi.ex:411: anonymous fn/5 in Ecto.Multi.apply_operations/5
(ecto) lib/ecto/adapters/sql.ex:576: anonymous fn/3 in Ecto.Adapters.SQL.do_transaction/3
(db_connection) lib/db_connection.ex:1283: DBConnection.transaction_run/4
also the timestamps seems to be null also, which from the console i can see the permission_id
and user_id
but not the primary id
and inserted_at
timestamps
I also tried to add this file into the lib/app/roles/user_permission.ex
but it still give me the same error
# user_permission.ex
use Ecto.Schema
@primary_key {:id, :binary_id, autogenerate: true}
@foreign_key_type :binary_id
alias App.{Accounts, Roles}
schema "users_permissions" do
belongs_to :user, Accounts.User
belongs_to :permission, Roles.Permission
timestamps([{:updated_at, :false}])
end