2012-12-21 3 views
1

나는 couchrest_model을 사용하여 루비에서 CouchDB와 상호 작용합니다. 나는 데이터베이스에 문서들을 가지고 있는데, 각각은 "updated_by"라는 키를 추가했다. 나는 그 개정판을 생성 한 변경에 대한 정보를 유지하고 싶다.어떤 사용자가 CouchDB 문서를 편집했는지 추적

이 작업을 수행하는 올바른 방법입니까?

올바른 방법이라면, 주 데이터베이스와 사용자 데이터를 요청할 수 있도록 couchrest_model을 어떻게 사용해야합니까?

감사합니다.

답변

1

유일한 방법은 userCtx.name 값이 validate_doc_update function 생각 동일하여 updated_by 필드를 강제하는 것입니다 :

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

예상 한 방식으로 데이터를하도록 요구 (디자인을 제외한) 모든 문서 콘텐츠를 제어 할이 기능 .

이 시점에서 중지 할 수 있지만 결함이 하나 있습니다. 모든 클라이언트는이 필드를 수동으로 설정해야합니다. 그것은 어색하고 그들을 "긴장시키지"못하게합니다. 이 문제를 해결하기 위해 CouchDB는 서버 측에서 비즈니스 로직의 일부를 클라이언트 구현에서이 지식을 제거하도록 설정할 수있는 update functions을 제공합니다. 그래서 업데이트 기능은 수도는 다음과 같습니다

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 주소 보유)를 추가하여이 기능을 확장 할 수 있으며 클라이언트가 메타 필드를 사용하면 메타 데이터 변경 사항에 대한 업데이트가 필요하지 않습니다.

그러나 서비스 사용자에 대해 몇 가지 예외를 제공해야하거나 유효성 검사 기능이 사용자 이름 updated_by 값과 다른 모든 문서를 거부하므로 CouchDB 노드간에 복제가 손상 될 수 있습니다.

+0

나는 꽤 두렵다. 나는 CrouchDB에 꽤 익숙하다! –

+0

업데이트 된 게시물을 더 자세히 보려면, 죄송합니다. (: – Kxepal

+0

Perfect :) Thanks! –