动态选择字段以在elixir ecto中更新

时间:2016-06-09 06:38:36

标签: elixir ecto

似乎查询表达式中的更新仅接受关键字列表(escape/3 in Ecto.Query.Builder.Update)。那么如何定义一个动态选择要更新的列的函数呢?

这样的事情:

def increment_field(column_name, count) when is_atom(field) do
     from t in Example.Entity, where: field(t, ^column_name) >= 0, update: [inc: [{^column_name, 1}]]
end

我试过这个,但得到了malformed :inc in update [{^column_name, 1}], expected a keyword list

我还尝试使用figment/2field/2,但没有运气。

1 个答案:

答案 0 :(得分:2)

Ecto.Query.Builder.Update.escape/3中的示例看来,您不能将^与密钥一起使用,但可以在整个关键字列表之前使用它,这对您有用用例。

模型Counter带有整数字段counter

iex(1)> from(c in Counter, select: c.counter) |> Repo.all
[16, 2, -93]
iex(2)> field = :counter
:counter
iex(3)> from(c in Counter, update: [inc: ^[{field, 1}]]) |> Repo.update_all([])
[debug] UPDATE "counters" SET "counter" = "counter" + ? [1] OK query=2.5ms
{3, nil}
iex(4)> from(c in Counter, select: c.counter) |> Repo.all
[17, 3, -92]