我有一个看起来像这样的架构模型。
USER => MEETING <= PROJECT
uuid | user_uuid |
| project_id | id
hour
我想在json中渲染一个像这样的对象:
{
uuid:"",
first_name:"",
project: [
{
name:""
meeting: [
hour:""
]
}
]
}
因此,单个用户有很多(在这种情况下为many_to_many)项目,而项目有很多(也是许多人)用户。
我还在项目和会议之间添加了一个关系,因为我想在项目中呈现会议数据,我的'项目'模式关系:
many_to_many :user, User, join_through: Meeting, join_keys:
[project_id: :id, user_uuid: :uuid]
has_many :meeting, Meeting
问题在于,当我预加载数据时,我为用户获得了正确的项目,但即使用户不属于该项目,我也能获得该项目的所有会议。
我知道问题的来源,因为我正在通过项目预加载会议,ecto不关心用户uuid,它只关注项目ID,因此它正在加载所有会议。
我像这样预加载我的数据:
Repo.all(User)
|> Repo.preload(project: :meeting)
如何将所有用户预加载所有项目,并让该项目的所有会议都与用户相关联?
答案 0 :(得分:0)
你缺少病情
def with_project_meetings(query) do
from u in query,
join: p in assoc(u, :projects),
join: m in assoc(u, :meetings), on: m.user_uuid == u.uuid,
preload: [projects: {p, meetings: m}]
end
User |> with_project_meetings |> Repo.all
参考:https://elixirforum.com/t/nested-preload-with-condition/5605/5