Dynamic field source for order_by

Well, see this example:

iex(1)> alias MusicDB.{Album,Track}
[MusicDB.Album, MusicDB.Track]
iex(2)> import Ecto.Query
Ecto.Query
iex(3)> album_id = 2
2
iex(4)> order_by = [asc: :duration] # atom OK for first source (Track)
[asc: :duration]
iex(5)> query = from(t in Track, [
...(5)>   join: a in Album, on: t.album_id == a.id,
...(5)>   select: %{
...(5)>     a: a.id,
...(5)>     t: t.id,
...(5)>     d: t.duration
...(5)>   },
...(5)>   limit: 3,
...(5)>   order_by: ^order_by
...(5)>   ])
#Ecto.Query<from t in MusicDB.Track, join: a in MusicDB.Album,
 on: t.album_id == a.id, order_by: [asc: t.duration], limit: 3,
 select: %{a: a.id, t: t.id, d: t.duration}>
iex(6)> query = Ecto.Query.where(query, [_y,z],  z.id == ^album_id)
#Ecto.Query<from t in MusicDB.Track, join: a in MusicDB.Album,
 on: t.album_id == a.id, where: a.id == ^2, order_by: [asc: t.duration],
 limit: 3, select: %{a: a.id, t: t.id, d: t.duration}>
iex(7)> Repo.all(query)

00:19:54.808 [debug] QUERY OK source="tracks" db=3.0ms
SELECT a1."id", t0."id", t0."duration" FROM "tracks" AS t0 INNER JOIN "albums" AS a1 ON t0."album_id" = a1."id" WHERE (a1."id" = $1) ORDER BY t0."duration" LIMIT 3 [2]
[%{a: 2, d: 754, t: 9}, %{a: 2, d: 774, t: 7}, %{a: 2, d: 896, t: 8}]
iex(8)> 

i.e.

iex(6)> query = Ecto.Query.where(query, [_y,z],  z.id == ^album_id)

So there must be something else in your code interfering with it.

In desperation I’d try

new_query = Ecto.Query.where(qr, [y, _z], y.is_active == true)

and see if that changes the error.