Are there any ways to preload records by selecting another joined columns?
# table structure
# User 1---* Post 1---* PostTag *---1 Tag
# extract definition of s
As the error message says, you need to select the binding you gave in from
when you are preloading, otherwise Ecto has no place to put the preloaded tags. Here is a simple answer:
query = from post in Post,
join: user in User, on: post.user_id == user.id,
select: {post, user.name},
preload: [:tags]
By returning a tuple, you can have the full post and the user.name on the side. Another approach is to return both post and users as full structs:
query = from post in Post,
join: user in User, on: post.user_id == user.id,
preload: [:tags, user: user]
or if you don't want all fields:
query = from post in Post,
join: user in User, on: post.user_id == user.id,
preload: [:tags, user: user],
select: [:id, :title, :user_id, user: [:name]]