2017-03-24 1 views
1

Je suis en train d'apprendre l'élixir et je n'arrive pas à comprendre comment utiliser les variables à l'intérieur de la commande par l'instruction. J'ai deux variables sort et direction. Voici la requête que je travaille et que vous souhaitez remplacer desc et date dans l'ordre par. J'ai essayé [^direction: entry.^sort] mais il jette une erreur. Existe-t-il un moyen d'utiliser des variables dans l'ordre?Variables en Ecto par

journal_entries = from entry in JournalEntry, 
    preload: [ 
    :journal_entry_lines, 
    journal_entry_lines: :journal_entry, 
    journal_entry_lines: :chart_account 
    ], 
    where: entry.id in ^journal_entry_ids, 
    order_by: [desc: entry.date], 
    limit: 100, 
    offset: 0 

Répondre

2

Depuis la clé de votre keyword list est une variable, vous allez vouloir utiliser la syntaxe alternative.

iex(1)> a = :desc 
:desc 
iex(2)> [{a, :b}] 
[desc: :b] 

Vous allez également vouloir utiliser la fonction field/2 pour accéder dynamiquement le nom du champ.

Quelque chose le long des lignes de ce qui suit devrait travailler

journal_entries = from entry in JournalEntry, 
    preload: [ 
    :journal_entry_lines, 
    journal_entry_lines: :journal_entry, 
    journal_entry_lines: :chart_account 
    ], 
    where: entry.id in ^journal_entry_ids, 
    order_by: [{^direction, field(entry, ^sort)}], 
    limit: 100, 
    offset: 0 

Cela suppose que la variable direction est l'un des :asc ou :desc et votre variable sort est un champ sur le schéma.

+0

Comment spécifier le champ? Est-ce que je ne le passe pas comme une ficelle? J'ai eu cette erreur 'atome attendu dans le champ/2, a obtenu:" date "' –

+0

Non, vous êtes censé passer dans un atome. Vous pouvez convertir la chaîne en un atome en utilisant ['String.to_atom/1'] (https://hexdocs.pm/elixir/String.html#to_atom/1). Mais faites attention à cela car les atomes ne sont pas collectés dans Elixir. Il y a aussi une limite supérieure sur le nombre d'atomes pouvant exister dans le système à un moment donné (ceci est configurable). –

+0

J'ai trouvé String.to_atom(), est-ce la meilleure façon de gérer cela? –