1

我正在使用 couchrest_model 从 ruby​​ 与 CouchDB 进行交互。我在数据库中有一堆文档,每个文档都添加了一个键“updated_by”,我想保留有关进行更改并生成该修订的用户的信息。

这是做事的正确方法吗?

如果这是正确的方法,我应该如何使用 couchrest_model 以便我可以请求用户数据以及我的主数据库?

谢谢!

4

1 回答 1

1

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值不同的文档。

于 2012-12-21T13:06:30.387 回答