2011-07-18 18 views
3

たとえば、2つのタイプのドキュメントを参照する1つのドキュメントがあります。注文書のIDを含むフィールド「ref」を有する後の注文「order」および「order_replies」。CouchDB ACL相互参照ドキュメント

私のvalidate_doc_update関数では、元のオーダーの作成者であれば、ユーザーはorder_replyドキュメントのみを変更できます。

関数内でnewDoc.refというIDのオーダーから「著者」フィールドを取得するにはどうすればよいですか?ここで

は、これまでのところ、私の検証機能の一部です:

if(userCtx.roles.indexOf('employee') >= 0) { 
    // [...] other doc types 
    if (newDoc.type == 'order_reply') { 
    //newDoc.ref.author is not the proper approach 
    require((userCtx.name == newDoc.ref.author), "this is not your order reply!"); 
    } 
} 
+0

[私の応答](http://stackoverflow.com/questions/6737285/couchdb-acl-cross-referencing-documents/6788113#6788113)に警告を追加しました。 –

答えて

2

は、オーダーのIDで著者のIDを入れてください。たとえば、次のように

  • 順:{ "_id": "order/jack/1", ... }
  • ための返信:あなたは複数の著者を持っている場合は、_idとして"order/author1/author2/.../authorN/ordernum"を使用

    if (userCtx.roles.indexOf('employee') !== -1) { 
        if (newDoc.type === 'order_reply') { 
        require(userCtx.name === newDoc.ref.split('/', 3)[1], "this is not your order reply!"); 
        } 
    } 
    

    { "ref": "order/jack/1", ... }

だから、あなたがチェックすることができます注文番号:

var parts = newDoc.ref.split('/'), 
    authors = parts.slice(1, -1); 
require(authors.indexOf(userCtx.name) !== -1, "this is not your order reply!"); 

更新:COUCHDB-1229のバグのため、doc._idに "/"を使用すると問題が発生することがあります。ユースケースによっては、別のセパレータを使用する方がよい場合があります。 ":"

+0

悲しいことに、これはうまくいきません。なぜなら、複数の作者がいるかもしれないからです。そのため、その名前はIDの一部にすることはできません。 – degeeman

+0

@ vc666私は複数の作家のための答えを編集しました。コードをテストする時間がありません、ごめんなさい...助けて欲しいです。 –

+1

ありがとう、これは行う必要があります。しかし、私はなぜCouchDBが関数内のドキュメントを検索するためのメソッドを提供していないのか分からない... – degeeman

関連する問題