maz

maz

Ecto Query preloading complex association

I’m doing a fairly complex join where I want to preload an array of ContentMediaItems (called :contents) that are nested in an association, Channel

But it appears that ecto thinks I’m referencing the MediaItem in the preload even though I’m doing:

preload: [channel: {chan, contents: chancon}],

and name the associations previously:

join: chan in assoc(con, :channel),
join: chancon in assoc(chan, :contents),

So why does the exception

    ** (Ecto.QueryError) field `MyWord.Multimedia.MediaItem.channel` in preload is not an association in query:

appear?

Here is the full query along with the error below it.

    from(m in MediaItem,
      join: con in ContentMediaItems,
      on: m.id == con.media_item_id,
      where: is_nil(m.published_at) == false,
      join: chan in assoc(con, :channel),
      where: chan.id == con.channel_id,
      join: chancon in assoc(chan, :contents),
      on: chancon.channel_id == chan.id,
      join: org in Org,
      on: m.org_id == org.id,
      where: org.slug == ^org_slug,
      order_by: [{:desc, :published_at}],
      preload: [:mediaitemartifacts],
      preload: [channel: {chan, contents: chancon}],
      select: %{id: m.id, inserted_at: m.inserted_at, media_item: m, channel: chan}
    )

Exception:

** (Ecto.QueryError) field `MyWord.Multimedia.MediaItem.channel` in preload is not an association in query:

from m0 in MyWord.Multimedia.MediaItem,
  join: c1 in MyWord.Channels.ContentMediaItems,
  on: m0.id == c1.media_item_id,
  join: c2 in MyWord.Channels.Channel,
  on: c2.id == c1.channel_id,
  join: c3 in MyWord.Channels.ContentMediaItems,
  on: c3.channel_id == c2.id and c3.channel_id == c2.id,
  join: o4 in MyWord.Orgs.Org,
  on: m0.org_id == o4.id,
  where: is_nil(m0.published_at) == false,
  where: c2.id == c1.channel_id,
  where: o4.slug == ^"myword-app",
  order_by: [desc: m0.published_at],
  limit: ^41,
  select: %{id: m0.id, inserted_at: m0.inserted_at, media_item: m0, channel: c2},
  preload: [:mediaitemartifacts],
  preload: [channel: {c2, contents: c3}]

Relevant schema information:

schema "mediaitems" do
    has_many(:mediaitemartifacts, MyWord.Multimedia.MediaItemArtifact)
    many_to_many(:channels, Channel, join_through: "channels_content_media_items", unique: true)

schema "channels" do
  has_many(:contents, ContentMediaItems)

schema "channels_content_media_items" do
  belongs_to :channel, Channel
  belongs_to :media_item, MediaItem

Marked As Solved

jswanner

jswanner

When using assoc/3 or preload the name of the association given as an argument needs to match the name given in the schema (including pluralization).

In the case of your error message, I’m pretty sure you need to use :channels not :channel.

Also Liked

sodapopcan

sodapopcan

Chiming in to say: when preloading in the query with complex joins like that, it can often be very slow. This is because only one query is run which returns a massive, de-normalized table that has to filtered down by Elixir. I would try it out with Repo.preload as well to see if there is a difference. There might not be, but from experience I once had a response time go from over 30 seconds to under 1 second just by switching to Repo.preload. Fewer queries aren’t always better!

Where Next?

Popular in Questions Top

senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
LegitStack
I’m hoping you guys can give me some general advice and perhaps code examples if you’re feeling up to it. I’m very interested in Elixir,...
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
Jim
As a follow up to my earlier question: I have the code compiling and running but not getting a successful login from the rest server. ...
New
lk-geimfari
What is most correct way to open, read and parse JSON file with poison? For example if we have example.json file in root of some projec...
New
mathew4509
I have a list say x = ["23gh", "56kh", "97mh"] I would like to pass each element to Val in each iteration. Say, in iteration 1 -------...
New
vonH
When I run the Plug and I recompile I wind up having to use Ctrl C to quit iex and start again. Witht the help of rlwrap I can use the cu...
New
LegitStack
I’m trying to make a websocket server in Phoenix or raw Elixir. I heard about gun, I think I could use cowboy, but since I’m not that sma...
New
hpopp
To simplify some tasks at work, I wrote and published this package yesterday. It’s a simple macro that enables Access behaviour on struct...
New
sabri
Can someone explain the settings of pool_size of Ecto in config file? and what is the recommend size? Thanks
New

Other popular topics Top

senggen
Erlang/OTP 25 [erts-13.2.2] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:1] 15:22:35.803 [error] gen_event {lager_file_backend...
New
sorentwo
Hello! tl;dr Announcing Oban, an Ecto based job processing library with a focus on reliability and historical observability. After spen...
977 41022 311
New
SoCreat
i’m a new one to elixir which editor can i use vs code? or atom? Thanks! :smiley:
New
chrismccord
Phoenix 1.4.0 released Phoenix 1.4 is out! This release ships with exciting new features, most notably with HTTP2 support, improved deve...
688 30048 115
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
grych
Hi folks, Few months ago I have announced the proof-of-concept of the library to manipulate the browsers DOM objects directly from Elixi...
639 49522 488
New
script
If I have a string “1000 cfu/ml” . I want to remove the characters and / and space . So the string is like this "1000" What is the ...
New
electic
Hi, I am new to Elixir. I am trying to use the DateTime component to insert a date into MySQL however the there seems to be no way to fo...
New
AstonJ
We’ve put together this wiki for Phoenix LiveView - please feel free to add any info you feel is worth including. What is Phoenix LiveV...
New
joeerl
Hello again - after a longish gap I’ve decided I really must dig into Elixir and see what’s been happening here - so I have a few questio...
New

We're in Beta

About us Mission Statement