Search code examples
elixirphoenix-frameworkecto

Pre-loading Model Schema


So I have a list of schema below with their associations.

user

  • has_one avatar
  • has_many posts
  • has_many comments

avatar

  • belongs_to user

post

  • belongs_to user
  • has_many comments

comment

  • belongs_to user
  • belongs_to post

My Problem is I'm trying to join my post -> comment -> user -> avatar in a query.

def get_post_comments!(id) do
query =
  from(
    p in Post,
    where: p.id == ^id,
    select: p,
    join: c in assoc(p, :comments),
    join: l in assoc(c, :user),
    join: d in assoc(l, :avatar),
    preload: [comments: {c, user: l, avatar: d}]
  )

IO.inspect(Repo.one!(query))end

I'm getting an error of

(Ecto.QueryError) field BazaarApp.Market.Comment.avatar in preload is not an association in query:


Solution

  • Fixed it clumsy mistake forgot to add brackets.

    From

    preload: [comments: {c, user: l, avatar: d}]
    

    To

    preload: [comments: {c, [user: {l, avatar: d}] }]