Last active
May 23, 2023 17:51
-
-
Save chrisdel101/a5c870c19cf8013e4c9842c210e47781 to your computer and use it in GitHub Desktop.
Loading put_assoc
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
# org params | |
org = %{ | |
"email" => "[email protected]", | |
"name" => "Toys R Us", | |
"phone" => "777777777", | |
"slug" => "toys-r-us" | |
} | |
# make org changeset | |
org_changeset = Organization.changeset(%Organization{}, o) | |
# #Ecto.Changeset< | |
# action: nil, | |
# changes: %{ | |
# email: "[email protected]", | |
# name: "Toys R Us", | |
# phone: "777777777", | |
# slug: "toys-r-us" | |
# }, | |
# errors: [], | |
# data: #Organization<>, | |
# valid?: true | |
# > | |
# insert org and preload | |
org_insert = Repo.insert!(org_changeset) |> Repo.preload(:employees) | |
# %Organization{ | |
# __meta__: #Ecto.Schema.Metadata<:loaded, "organizations">, | |
# id: 108, | |
# email: "[email protected]", | |
# name: "Toys R Us", | |
# slug: "toys-r-us", | |
# phone: "777777777", | |
# employees: [], | |
# inserted_at: ~N[2023-05-23 17:42:04], | |
# updated_at: ~N[2023-05-23 17:42:04] | |
# } | |
# employee params | |
e = %{ | |
"email" => "[email protected]", | |
"email_confirmation" => "[email protected]", | |
"first_name" => "Joe ", | |
"last_name" => "Schmo", | |
"password" => "password", | |
"password_confirmation" => "password", | |
"role" => "owner" | |
} | |
# make employee changeset | |
e_changeset = Employee.registration_changeset(%Employee{}, emp) | |
# #Ecto.Changeset< | |
# action: nil, | |
# changes: %{ | |
# email: "[email protected]", | |
# first_name: "Joe ", | |
# hashed_password: "**redacted**", | |
# last_name: "Schmo", | |
# role: "owner" | |
# }, | |
# errors: [], | |
# data: #Employee<>, | |
# valid?: true | |
# > | |
# insert and preload | |
e_insert = Repo.insert!(e_changeset) |> Repo.preload(:organizations) | |
# #Employee< | |
# __meta__: #Ecto.Schema.Metadata<:loaded, "employees">, | |
# id: 30, | |
# first_name: "Joe ", | |
# last_name: "Schmo", | |
# role: "owner", | |
# client_type: nil, | |
# email: "[email protected]", | |
# confirmed_at: nil, | |
# organizations: [], | |
# users: #Ecto.Association.NotLoaded<association :users is not loaded>, | |
# alerts: #Ecto.Association.NotLoaded<association :alerts is not loaded>, | |
# owner: #Ecto.Association.NotLoaded<association :owner is not loaded>, | |
# inserted_at: ~N[2023-05-23 16:08:40], | |
# updated_at: ~N[2023-05-23 16:08:40], | |
# ... | |
# > | |
# build table assoc | |
org_update = Ecto.Changeset.put_assoc(org_changeset, :employees, [e_insert]) | |
# #Ecto.Changeset< | |
# action: nil, | |
# changes: %{ | |
# email: "[email protected]", | |
# employees: [ | |
# #Ecto.Changeset<action: :update, changes: %{}, errors: [], | |
# data: #Employee<>, valid?: true> | |
# ], | |
# name: "Toys R Us", | |
# phone: "777777777", | |
# slug: "toys-r-us" | |
# }, | |
# errors: [], | |
# data: #Organization<>, | |
# valid?: true | |
# > | |
# try to run assoc - FAIL | |
Repo.update(org_update) | |
# ** (Ecto.NoPrimaryKeyValueError) struct `%Organization{__meta__: #Ecto.Schema.Metadata<:built, "organizations">, id: nil, email: nil, name: nil, slug: nil, phone: nil, employees: #Ecto.Association.NotLoaded<association :employees is not loaded>, inserted_at: nil, updated_at: nil}` is missing primary key value | |
# (ecto 3.9.4) lib/ecto/repo/schema.ex:977: anonymous fn/3 in Ecto.Repo.Schema.add_pk_filter!/2 | |
# (elixir 1.14.1) lib/enum.ex:2468: Enum."-reduce/3-lists^foldl/2-0-"/3 | |
# (ecto 3.9.4) lib/ecto/repo/schema.ex:416: Ecto.Repo.Schema.do_update/4 | |
# iex:12: (file) | |
select * from organizations; | |
id | name | slug | email | phone | inserted_at | updated_at | |
----+-----------+-----------+--------------+-----------+---------------------+--------------------- | |
108 | Toys R Us | toys-r-us | toys@rus.com | 777777777 | 2023-05-23 16:41:19 | 2023-05-23 16:41:19 | |
(1 row) | |
# OTHER DETAILS | |
Organization shcema & migration | |
schema "organizations" do | |
field :email, :string | |
field :name, :string | |
field :slug, :string | |
field :phone, :string | |
many_to_many :employees, Employee, join_through: "organization_employees" | |
.... | |
def change do | |
create table(:organizations) do | |
add :name, :string | |
add :slug, :string | |
add :email, :string | |
add :phone, :string | |
timestamps() | |
end | |
end | |
Employee schema & migration - unrelated relationships are shown in case they are error causing | |
schema "employees" do | |
field :first_name, :string | |
field :last_name, :string | |
field :role, :string | |
field :client_type, :string | |
field :email, :string | |
field :password, :string, virtual: true, redact: true | |
field :hashed_password, :string, redact: true | |
field :confirmed_at, :naive_datetime | |
many_to_many :organizations, Organization, join_through: "organization_employees" | |
# all users created by an employee | |
has_many :users, User | |
# all alerts created by an employee | |
has_many :alerts, Alert | |
# any employees that is an owner | |
has_one :owner, Owner | |
create table(:employees) do | |
add :first_name, :string | |
add :last_name, :string | |
add :client_type, :string | |
add :role, :string, null: false | |
add :email, :citext, null: false | |
add :hashed_password, :string, null: false | |
add :confirmed_at, :naive_datetime | |
OrganizationEmployees migration | |
def change do | |
create table(:organization_employees) do | |
add :organization_id, references(:organizations) | |
add :employee_id, references(:employees) | |
timestamps() | |
end |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment