drapermd

drapermd

How to update struct in nested embeds_many array

I’m finding it very difficult to figure out how to update an embedded struct that is in a nested embeds_many array.

Here’s the basic schema..

(Main row in postgres) Gathering → Activities (embeds_many Activity on Gathering) → rsvp (embeds_many ActivityRsvp on Activity)

The struggle to update the records in the rsvp collection is real. I’ve spent days reading methods to do this.

Ultimately, the insert works fine, but I can’t figure out how to make put_embed update the record.

A key difficulty was (which I believe is a bug), autogenerate_id was not working for the nested embeds_many, so I had to generate my own primary keys. This leads me to believe that this feature simply isn’t supported?

So to recap, if I bypass the error by generating my own primary key I can get insert to work fine using rsvps ++ [rcs], but I can’t get updates to work. Depending on the hack I try, I get a cornucopia of different errors. usually around get_change/6

Models:

  schema "gatherings" do
    embeds_many :activities, Activity
  end
 # Activity
  embedded_schema do
    embeds_many :rsvp, ActivityRsvp
  end
# ActivityRsvp
  embedded_schema do
    field :username, :string
    field :attending, :boolean
  end
  def change_rsvp_status_for_user(%Gathering{} = gathering, %Activity{ rsvp: rsvps } = activity, %{ username: username, attending: attending } = rsvp_params) do
    rcs = case get_rsvp_status_for_user(activity, username) do
      {:unknown, changeset} -> changeset
      {:ok, %ActivityRsvp{id: id} = r, _attendance_list} -> ActivityRsvp.changeset(r, rsvp_params)
    end

    case rcs.valid? do
     true -> acs = activity
             |> Activity.changeset
             |> put_embed(:rsvp,  [rcs])
             {:ok, a} = update_activity(gathering, acs )
             get_rsvp_status_for_user(a, username)
     false -> {:error, rcs}
    end
  end
 test/geeks/activities_test.exs:69
 ** (Ecto.NoPrimaryKeyValueError) struct `%ActivityRsvp{attending: true, comment: nil, **id: nil,** inserted_at: nil, no_show: false, updated_at: nil, username: "greybeard_prime"}` is missing primary key value
 stacktrace:
   (ecto) lib/ecto/embedded.ex:155: anonymous fn/3 in Ecto.Embedded.autogenerate_id/5

First Post!

drapermd

drapermd

I think I’m going to throw the towell in on this and just pull Activity into a separate table. This will change a lot of code for me, but it seems like I’m just charging up the wrong hill on this.

Where Next?

Popular in Questions Top

rms.mrcs
Hi, I need to transform a list of numbers into a map where the keys are the indexes and the values are the original values of the list. ...
New
minhajuddin
I have seen a lot of code which picks the first element from a list using Enum.at(0) instead of List.first. Is there a reason why people ...
New
Qqwy
Original source of discussion: This topic on the Pragmatic Programmers’ Functional Web Development with Elixir, OTP, and Phoenix forum. ...
New
openscript
Hello! Sorry for this astonishing simple question, but I’m really stuck. I try to set up the intellij-elixir plugin, but I don’t know ho...
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
jerry
Good day to you all. I have been struggling to get a query involving like and ilike to work. Can anyone assist me on this, please? pro...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New

Other popular topics Top

jononomo
I am trying to figure out how Mix knows whether the environment is test, dev, or prod – where is this set? Thanks.
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
dogweather
I wrote this comment on r/haskell, and it’s not popular there. :wink: But I think I’m on to something… Haskell reminds me of Java, and e...
New
siddhant3030
Hi, I have to write a raw query for one of my project. But till now I have used ecto queries and don’t have much experience writing raw ...
New
albydarned
Hello all! I am typing this post from my new MacBook Pro with the M1 chip. I’m loving it so far, and will probably use it as my daily dr...
New
sergio
Kind of like when jquery came out, it was super necessary. Existing drag and drop libraries have a bunch of baggage to support old browse...
New

We're in Beta

About us Mission Statement