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]))