【问题标题】:Preload association table data预加载关联表数据
【发布时间】:2018-02-06 17:34:23
【问题描述】:

我有一个看起来像这样的模式模型。

USER => MEETING <= PROJECT
uuid | user_uuid  | 
     | project_id |  id
          hour

我想用json渲染,像这样的一个对象:

{
  uuid:"",
  first_name:"",
  project: [
    {
      name:""
      meeting: [
         hour:""
      ]
    }
  ]
}

所以一个用户有很多(在这种情况下是many_to_many)项目,一个项目有很多(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)

如何预加载所有用户及其所有项目并将该项目的所有会议与用户关联?

【问题讨论】:

    标签: elixir phoenix-framework ecto


    【解决方案1】:

    你缺少条件

    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

    【讨论】:

    • 我尝试做类似的事情,但它并没有改变我的结果。 query = from u in User, join: p in assoc(u, :project), join: m in assoc(u, :meeting), on: u.uuid == m.user_uuid, preload: [projects: {p, meeting: m}] query |> Repo.all,我还必须在我的用户中添加 has_many 会议,因为它说会议关联不存在
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-29
    • 2021-01-28
    • 1970-01-01
    相关资源
    最近更新 更多