Ecto预加载并加入嵌套模型

时间:2016-09-08 06:59:10

标签: elixir ecto

以下是代码:

query = from(p in Tree,
     where: p.name == ^tree,
     where: p.user_id == ^user_id,
      preload: [kw: :keyo]
      )
     data = Repo.all(query)

这可以工作,但会返回此结构中的数据:

{
 Kw: [
  {user_id: 1, keyo_id: 2, keyo: {some_keyo_thing: 5},
  {user_id: 1, keyo_id: 32, keyo: {#keyo data}
  ...
  ]
}

无论如何要在上面的查询中获得kw / keyo数据的合并输出?我希望结果是:

[
  {user_id: 1, keyo_id: 2, some_keyo_thing: 5,
  {user_id: 1, keyo_id: 32, , some_keyo_thing: 3
  ...
  ]

1 个答案:

答案 0 :(得分:0)

不是使用预加载,而是最好使用显式连接,然后选择要返回的字段

query = from(p in Tree,
             join: kw in Kw, on: kw.tree_id == p.id,
             join: k in Keyo, on: k.kw_id == kw.id,
             where: p.name == ^tree,
             where: p.user_id == ^user_id,
             select: %{ user_id: p.user_id, keyo_id: k.id, some_keyo_thing: k.some_keyo_thing }
        )

Repo.all(query)

它有点冗长,但会给你更多控制权。我猜你的kw和keyo的型号名称,所以必要时更正但是这应该有用