arpan

arpan

Confussed with build_assoc vs put_assoc vs cast_assoc

Can someone clearly explain to me the differences between build_assoc, put_assoc, and cast_assoc.
Also what should I use when?

This is what I have understood so far…

  • We use build_assoc when we are creating a new record and we want to associate it with a parent record by setting a foreign key like…

Building a comment and setting its belongs_to association by setting the post foreign key as…

Repo.get(Post, 13)
|> build_assoc(post, :comments)

# %Comment{id: nil, post_id: 13}

We can do this manually by comment.post_id = 13

  • We use put_assoc and put_embeded(for embedded schemas) when we have an existing record and we want to update its associations
  • It is used usually when the data is internal to the application.

  • This will delete all its old associations

%Comment{body: "Example"}
|> Ecto.Changeset.change()
|> Ecto.Changeset.put_assoc(:post, post)
|> Repo.insert!()
  • We use cast_assoc and cast_embeded(for embedded schemas) when we have an existing record and we want to update its associations
  • It is used usually when the data is external to the application (we receive it in our params)

  • The will delete all its old associations

  • For this to work the associated records must define a changeset/2 function in their respective schemas

  • Cast assoc will keep the previous associations and add to it (unlike put_assoc which deletes all previous associations), if an association contains an id that conflicts with an already existing association then cast_assoc will update the conflicting child association with the new incoming values.

  • Cast assoc is helpfull when raw data comes in from an external source like a CSV file, etc.

(Like for a post all its associated comments come in as params and we need to cast it and update into the database.)

Can someone help me out to clear my understanding, if something is wrong in the above things I have understood or if I am missing something important.

Most Liked

josevalim

josevalim

Creator of Elixir

From my perspective you got everything correct. Good job!

15
Post #2
joaquinalcerro

joaquinalcerro

Here is a very detailed post from @josevalim about this topic if you have additional doubts:

This post has been updated.

Best regards,

Where Next?

Popular in Questions Top

chokchit
** (DBConnection.ConnectionError) connection not available and request was dropped from queue after 2733ms. You can configure how long re...
New
New
Kurisu
For example for a current url like http://localhost:4000/cosmetic/products?_utf8=✓&query=perfume&page=2, I would like to get: ...
New
qwerescape
Is there a way to get the call stack or stack trace at any point in the code? Not from exceptions, but an expression that returns how the...
New
JulienCorb
I am trying to implement my new.html.eex file to create new posts on my website. new.html.eex: <h1>Create Post</h1> <%= ...
New
itssasanka
Hi all, Trying to get some more clarity over utc_datetime and naive_datetime for Ecto: The documentation above suggests that while ...
New
nobody
Hi! In PHP: $_SERVER[‘SERVER_ADDR’] - in Elixir? Searched the docs for ip address and the web, no good results. Thanks!
New
bsollish-terakeet
Credo is smart enough to check for (something like) this: assert length(the_list) == 0 with this response: Checking if an enum is empt...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New

Other popular topics Top

hariharasudhan94
lets say i have a sample like a = 20; b = 10; if (a > b) do {:ok, "a"} end if (a < b) do {:ok, b} end if (a == b) do {:ok, "equa...
New
chrismccord
As promised, the first release candidate of Phoenix 1.3.0 is out! This release focuses on code generators with improved project structure...
New
lessless
I believe there are people here who are dealing with CSV files import on the daily basis, and since Excel is a really popular tool there ...
New
greenz1
I have a phoenix application from which a user can download multiple(5-6) files of size 1MB. I couldn’t find anything related to sending ...
New
belgoros
I’m not a pro in using Regex and can’t figure out why the following behaviour happens, especially if we take into account the difference ...
New
stefanchrobot
What’s the safe way to decode a JSON string into a struct? I want to avoid calling String.to_atom. Jason.decode can give me a map with st...
New
jay1
Why is it that the mnesia database isn’t the most preferred database for use in Elixir/Phoenix?
New
jason.o
In the code below, if the create action is not set to accept “extra_key” as an input, it errors out with a message shown above. Is there ...
New
shijith.k
I am trying to start a new phoenix project with elixir 1.9, but mix phx.new does not work. It says that ** (Mix) The task "phx.new" could...
New
jononomo
For some reason my phoenix channels are working for me in my local dev environment, but as soon as I deploy via Docker, I get a 403 error...
New

Latest on Elixir Forum

Elixir Forum

We're in Beta

About us Mission Statement