1

私はcouchrest_modelを使用してrubyからCouchDBと対話しています。データベースにたくさんのドキュメントがあり、それぞれにキー「updated_by」を追加しました。このキーに、そのリビジョンを生成した変更を加えたユーザーに関する情報を保持したいと思います。

これは物事を行うための正しい方法ですか?

これが正しい方法である場合、メインデータベースだけでなくユーザーデータも要求できるように、couchrest_modelをどのように使用する必要がありますか?

ありがとう!

4

1 に答える 1

1

唯一の方法は、 validate_doc_update関数と同じ値updated_byでフィールドを強制することです。userCtx.name

function(newdoc, olddoc, userctx, secobj){
   if (newdoc.updated_by != userctx.name)
       throw({"forbidden": "`updated_by` field should match real updater user name"})
}

この機能は、すべてのドキュメント(デザインドキュメントを除く)のコンテンツを制御し、期待どおりのデータが必要です。

この時点で停止することもできますが、彼には1つの欠点があります。すべてのクライアントは、このフィールドを手動で設定する必要があります。それは厄介で、彼らに「リラックス」させないでください。この問題を解決するために、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アドレスを保持します)。クライアントがそれを使用する場合は、メタデータの変更を更新する必要はありません。

ただし、サービスユーザーにいくつかの例外を提供する必要があることに注意してください。そうしないと、validate関数がユーザー名の値とは異なるすべてのドキュメントを拒否するため、CouchDBノード間の複製が壊れupdated_byます。

于 2012-12-21T13:06:30.387 に答える