2016-06-09 94 views
2

更新它似乎查詢表達式中的更新只接受關鍵字列表(escape/3 in Ecto.Query.Builder.Update)。那麼如何定義一個函數來動態選擇一個列來更新?動態選擇字段在elixir ecto

事情是這樣的:

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,但沒有運氣。

回答

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] 
+0

THX,你救了我的一天:) –