Can't preload list of atoms

I’ve tried
from p in Post, preload: [:user, :likes], order_by: [desc: p.id])
and
from p in Post, preload: ^[:user, :likes], order_by: [desc: p.id])
It gives
preload expects an atom, a (nested) keyword or a (nested) list of atoms
I can’t use Repo.preload/3 cause this query is preload of other query =P

the first version should work just fine.

Can you show us the whole expression that raises error?

Server: localhost:4000 (http)
Request: GET /api/users/andrey
** (exit) an exception was raised:
    ** (ArgumentError) invalid preload `#Ecto.Query<from p in Buzzter.Posts.Post, order_by: [desc: p.id], preload: [[:user, :likes]]>` in `#Ecto.Query<from p in Buzzter.Posts.Post, order_by: [desc: p.id], preload: [[:user, :likes]]>`. preload expects an atom, a (nested) keyword or a (nested) list of atoms
        (buzzter) lib/buzzter/accounts/accounts.ex:44: Buzzter.Accounts.get_user/2
        (buzzter) lib/buzzter/web/controllers/api/user_controller.ex:11: Buzzter.Web.UserController.show/2
        (buzzter) lib/buzzter/web/controllers/api/user_controller.ex:1: Buzzter.Web.UserController.action/2
        (buzzter) lib/buzzter/web/controllers/api/user_controller.ex:1: Buzzter.Web.UserController.phoenix_controller_pipeline/2
        (buzzter) lib/buzzter/web/endpoint.ex:1: Buzzter.Web.Endpoint.instrument/4
        (phoenix) lib/phoenix/router.ex:277: Phoenix.Router.__call__/1
        (buzzter) lib/buzzter/web/endpoint.ex:1: Buzzter.Web.Endpoint.plug_builder_call/2
        (buzzter) lib/plug/debugger.ex:123: Buzzter.Web.Endpoint."call (overridable 3)"/2
        (buzzter) lib/buzzter/web/endpoint.ex:1: Buzzter.Web.Endpoint.call/2
        (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
        (cowboy) /home/chernyshov/projects/buzzter/deps/cowboy/src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4

without ^

Server: localhost:4000 (http)
Request: GET /api/users/andrey
** (exit) an exception was raised:
    ** (ArgumentError) invalid preload `#Ecto.Query<from p in Buzzter.Posts.Post, order_by: [desc: p.id], preload: [:likes, :user]>` in `#Ecto.Query<from p in Buzzter.Posts.Post, order_by: [desc: p.id], preload: [:likes, :user]>`. preload expects an atom, a (nested) keyword or a (nested) list of atoms
        (buzzter) lib/buzzter/accounts/accounts.ex:43: Buzzter.Accounts.get_user/2
        (buzzter) lib/buzzter/web/controllers/api/user_controller.ex:11: Buzzter.Web.UserController.show/2
        (buzzter) lib/buzzter/web/controllers/api/user_controller.ex:1: Buzzter.Web.UserController.action/2
        (buzzter) lib/buzzter/web/controllers/api/user_controller.ex:1: Buzzter.Web.UserController.phoenix_controller_pipeline/2
        (buzzter) lib/buzzter/web/endpoint.ex:1: Buzzter.Web.Endpoint.instrument/4
        (phoenix) lib/phoenix/router.ex:277: Phoenix.Router.__call__/1
        (buzzter) lib/buzzter/web/endpoint.ex:1: Buzzter.Web.Endpoint.plug_builder_call/2
        (buzzter) lib/plug/debugger.ex:123: Buzzter.Web.Endpoint."call (overridable 3)"/2
        (buzzter) lib/buzzter/web/endpoint.ex:1: Buzzter.Web.Endpoint.call/2
        (plug) lib/plug/adapters/cowboy/handler.ex:15: Plug.Adapters.Cowboy.Handler.upgrade/4
        (cowboy) /home/chernyshov/projects/buzzter/deps/cowboy/src/cowboy_protocol.erl:442: :cowboy_protocol.execute/4

I was asking for the code that raises error and not the stacktrace, but his is helpful too I guess.

Tell me what query you want to do: is it:

  • fetch user, with all his/her posts and likes?

And in your schema you have User that has many Posts and also User that has many Likes ?

user = Repo.one!(from p in User, where: fragment("lower(?)", p.username) == ^username)
       |> Repo.preload (from p in Buzzter.Posts.Post, preload: [:user, :likes], order_by: [desc: p.id])

I’m fetching user with posts
and posts have likes and user(author)

if I replace this with this

=user = Repo.one!(from p in User, where: fragment("lower(?)", p.username) == ^username, preload: [posts: :user, posts: :likes], order_by: [desc: p.id])


It will be fine fine but posts will not be sorted

The error message is saying that invalid preload #Ecto.Query<>. Which means that Ecto.Query is an invalid preload. You cannot pass an Ecto.Query there. I am guessing you want to do this:

|> Repo.preload(posts: from(p in Buzzter.Posts.Post, preload: [:user, :likes], order_by: [desc: p.id]))
2 Likes