2016-09-08 3 views
0

Вот код: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} 
    ... 
    ] 
} 

Во всяком случае, чтобы слились выводом данных кВт/Keyo в запрос выше? Я хотел бы результат быть:

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

ответ

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) 

Это немного больше verbose, но дает вам намного больше контроля. Я догадываюсь о ваших именах моделей для kw и keyo, поэтому при необходимости, но это должно работать

Смежные вопросы