我正在使用 couchrest_model 从 ruby 与 CouchDB 进行交互。我在数据库中有一堆文档,每个文档都添加了一个键“updated_by”,我想保留有关进行更改并生成该修订的用户的信息。
这是做事的正确方法吗?
如果这是正确的方法,我应该如何使用 couchrest_model 以便我可以请求用户数据以及我的主数据库?
谢谢!
updated_by
唯一的方法是通过相等的值强制字段userCtx.name
认为validate_doc_update 函数:
function(newdoc, olddoc, userctx, secobj){
if (newdoc.updated_by != userctx.name)
throw({"forbidden": "`updated_by` field should match real updater user name"})
}
此功能将控制所有文档(设计文档除外)的内容,要求它们以您期望的方式拥有数据。
您可能会在这一点上停下来,但他有一个缺陷:您的所有客户都必须手动设置此字段。这很尴尬,不能让他们“放松”。为了解决这个问题,CouchDB 提供了更新功能,允许在服务器端设置部分业务逻辑,从客户端实现中删除这些知识。因此,您的更新功能可能如下所示:
function(doc, req){
if (!doc){ // new doc
doc = JSON.parse(req.body);
}
doc.updated_by = req.userCtx.name;
return [doc, {"json": {"status": "ok"}}
}
他让你updated_by
以正确的方式设置字段。此外,您可以通过添加越来越多的元字段(例如userCtx.peer
保存客户端 IP 地址)来扩展此功能,如果您的客户将使用它,他们将不需要对您的元数据更改进行任何更新。
但请注意,您需要为服务用户提供一些例外,否则您将在 CouchDB 节点之间获得损坏的复制,因为 validate 函数将拒绝所有与用户名updated_by
值不同的文档。