freewebwithme
Creating a User with Profile schema?
Hi!
I want to create a user and also profile schema at the same time.
For example
defmodule MyApp.Accounts.User do
use Ecto.Schema
import Ecto.Changeset
schema "users" do
field :username, :string
field :password, Comeonin.Ecto.Password
field :email, :string
has_one :profile, MyApp.Accounts.Profile
timestamps()
end
end
defmodule MyApp.Accounts.Profile do
use Ecto.Schema
import Ecto.Changeset
schema "profiles" do
field :phone_number, :string
field :address, :string
field :intro, :string
belongs_to :user, MyApp.Accounts.User
timestamps()
end
end
then I got an input from user like this
attrs = %{username: "username",
password: "secret",
email: "email@example.com",
phone_number: "2223334444",
address: "some address",
intro: "Hello world!"}
then in my accounts.ex file
def create_user(attrs) do
user_changeset = User.changeset(%User{}, attrs)
profile_changeset = Profile.changeset(%Profile{}, attrs)
user_changeset
|> Ecto.Changeset.put_assoc(:profile, profile_changeset)
|> Repo.insert()
end
I think it works…
But is there any better (elixir) way?
Most Liked
OvermindDL1
Ecto’s associations assume there is only one join column, but because of legacy reasons I have at minimum 2 join columns and sometimes more, thus making the Ecto associations absolutely useless for me as it assumes a design that cannot exist here. ^.^;
OvermindDL1
No that’s pretty much it, although I’d probably use a transaction because I like the reliability of the transaction, but it doesn’t look like it actually matters in this case. ![]()
OvermindDL1
I most often use Ecto.Multi’s yes, but then I frequently don’t use associations due to significant limitations of them anyway. ![]()
Nah, you can just run it in a transaction function all that you need to do anyway. ^.^
wolfiton
This should offer you an example from the docs https://hexdocs.pm/ecto/Ecto.Repo.html#c:transaction/2
r8code
Thanks @wolfiton and @OvermindDL1 for the reply







