Ecto中的变量按顺序排列

时间:2017-03-24 17:46:50

标签: elixir ecto

我只是在学习elixir,我无法弄清楚如何在order by语句中使用变量。我有两个变量sortdirection。以下是我工作过的查询,并希望按顺序替换descdate。我试过了[^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

1 个答案:

答案 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变量是架构上的字段。