にいくつかのデータを保存していますがmnesia
、関連するほとんどの値を変更できるようにしたいと思います。
ナイーブ
change(RecordId, Slot, NewValue) ->
[Rec] = do(qlc:q([X || X <- mnesia:table(rec), X#rec.id =:= RecordId])),
NewRec = Rec#rec{Slot=NewValue},
F = fun() -> mnesia:write(NewRec) end,
{atomic, Val} = mnesia:transaction(F),
Val.
それをしません。コンパイラは、またはでSlot
はないと文句を言います。上記のように一般的なスロット編集機能を表現する方法はありますか、それともたくさんのsを定義するのに行き詰まりますか?atom
_
change_slot
insert
わずかに良いアプローチは、とfind
部分を引き出すことです
atomic_insert(Rec) ->
F = fun() -> mnesia:write(Rec) end,
{atomic, Val} = mnesia:transaction(F),
Val.
find(RecordId) ->
[Rec] = do(qlc:q([X || X <- mnesia:table(rec), X#rec.id =:= RecordId])),
Rec.
change(RecordId, name, NewValue) ->
Rec = find(RecordId),
NewRec = Rec#rec{name=NewValue},
atomic_insert(NewRec);
change(RecordId, some_other_property, NewValue) ->
Rec = find(RecordId),
NewRec = Rec#rec{some_other_property=NewValue},
...
しかし、そこにはまだ少しコードの重複があります。そのパターンを抽象化する方法はありますか?レコードを編集できるようにするための確立された手法はありますか?一般的なアイデアはありますか?