Я храню некоторые данные в 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
не является 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},
...
но там все еще есть немного дублирования кода. Есть ли способ абстрагировать этот шаблон? Существует ли устоявшаяся методика, позволяющая редактировать записи? Есть идеи вообще?