Are there any ways to preload records by selecting another joined columns?
# table structure
# User 1---* Post 1---* PostTag *---1 Tag
# extract definition of scheme
scheme "posts" do
...
has_many :post_tags, PostTag
has_many :tags, [:post_tags, :tag]
end
Following pseudo-code expresses my goal(but not work).
query = from post in Post,
join: user in User, on post.user_id == user.id,
select: %{
id: post.id,
title: post.title,
user_name: user.name, # <= column at joined table
},
preload: [:tags]
Repo.all(query)
#=> ** (Ecto.QueryError) the binding used in `from` must be selected in `select` when using `preload` in query:`
I expect the result like this.
[
%{id: 1, title: "AAA", user_name: "John", tags: [%{name: "elixir"},...]},
%{id: 2, title: "BBB", user_name: "Mike", tags: [%{name: "erlang"},...]},
...
]
tags
) likeuser
? I try to use custom querytag_q = from tag in Tag, select: [:id, :name]
, and pass preload section(preload: [tags: ^tag_q]
). This can run, but tags fields are not filtered. – Miniver