我只是在学习elixir,我无法弄清楚如何在order by语句中使用变量。我有两个变量sort
和direction
。以下是我工作过的查询,并希望按顺序替换desc
和date
。我试过了[^direction: entry.^sort]
,但它抛出了一个错误。有没有办法按顺序使用变量?
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
答案 0 :(得分:3)
由于keyword list中的密钥是变量,因此您将需要使用备用语法。
iex(1)> a = :desc
:desc
iex(2)> [{a, :b}]
[desc: :b]
您还希望使用field/2
函数动态访问字段名称。
以下内容应该有效
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
这假定direction
变量是:asc
或:desc
之一,而您的sort
变量是架构上的字段。