2017-03-24 1 views
0

J'ai une requête qui tire dans les relations à utiliser dans un api json. Si j'exclus l'instruction select, cela fonctionne correctement, cependant, lorsque j'insère l'instruction select, les relations n'apparaissent pas. J'ai besoin de l'instruction select pour inclure une sous-requête pour un attribut. Comment puis-je spécifier les relations dans le select pour qu'elles s'affichent?Ecto sélectionner les relations de précharge

journal_entries = from entry in JournalEntry, 
    select: %{ 
    entry: entry, 
    id: entry.id, 
    account_id: entry.account_id, 
    archived_at: entry.archived_at, 
    date: entry.date, 
    deleted_at: entry.deleted_at, 
    is_closing: entry.is_closing, 
    is_confirmed: entry.is_confirmed, 
    note: entry.note, 
    amount: (fragment("(SELECT sum(amount) FROM journal_entry_lines WHERE kind = 0 and journal_entry_id = ?)", entry.id)) 
    }, 
    preload: [ 
    :journal_entry_lines, 
    journal_entry_lines: :journal_entry, 
    journal_entry_lines: :chart_account 
    ], 
    where: entry.account_id == ^user.account_id 
    and is_nil(entry.deleted_at) 

Répondre

2

Lorsque vous utilisez select/3, vous ne pouvez pas utiliser preload/3 de la même manière. Vous allez devoir le faire manuellement.

journal_entries = from entry in JournalEntry, 
    # Make sure you join all of the tables you want data for. 
    join: jel in assoc(entry, :journal_entry_lines, 
    select: %{ 
    entry: entry, 
    id: entry.id, 
    account_id: entry.account_id, 
    archived_at: entry.archived_at, 
    date: entry.date, 
    deleted_at: entry.deleted_at, 
    is_closing: entry.is_closing, 
    is_confirmed: entry.is_confirmed, 
    note: entry.note, 
    amount: (fragment("(SELECT sum(amount) FROM journal_entry_lines WHERE kind = 0 and journal_entry_id = ?)", entry.id)), 
    # Specify a key for your relation, and set its value. 
    journal_entry_lines: jel 
    }, 
    where: entry.account_id == ^user.account_id 
    and is_nil(entry.deleted_at) 
+0

Il existe de nombreuses lignes de journal pour chaque écriture de journal, comment éviter la duplication? –

+0

Vous n'avez pas vraiment. Lorsque vous appelez 'preload/3', il fait une requête distincte pour charger ces données afin d'éviter la duplication. Vous pouvez suivre cette route et faire plusieurs requêtes. –