【发布时间】:2012-05-30 18:14:03
【问题描述】:
我在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_slots 上?
稍微好一点的方法是取出 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},
...
但是那里仍然有一些代码重复。有没有办法抽象出这种模式?是否存在允许编辑记录的既定技术?一般有什么想法吗?
【问题讨论】:
-
参见erlang.org/doc/reference_manual/records.html 中的第 9.8 节“记录的内部表示”。字段名称仅在编译时可用,因此您不能在#rec 语法中为字段名称使用变量。 record_info() 函数可能对您正在尝试做的事情有所帮助。