Search code examples
ruby-on-railsjsonmodelcouchdbcouchrest

How to access CouchDB documents using CouchRest model


Please help me to solve this. I’ve around 1500 documents in my CouchDB, each document belongs to any one of the types (‘Survey’ and ’Response’).

I need solution for followings

1] Need to display Document Ids (_id) in a Dropdown list which has document type (documentType) as ‘Survey’

2] If I select an item (_id) from drop down, I need to display all document Ids (_id) in list box which belongs to selected ID (_id selected from drop down list)

I've total 1500 documents like this

{
   "_id": "ff2fb2554682ba613c2f83c63502808a",
   "_rev": "4-dd559696434a402739e789ccc8c9a481",
   "answers": [
       {
           "answers": [
               "Aug 19,2011"
           ],
           "questionId": "50f3df434ae02ac7fff48c1c2bde83e4"
       },
       {
           "answers": [
               "Bechu Yadav"
           ],
           "questionId": "15504f006e58872fd94871fe0c9d32ad"
       },
       {
           "answers": [
               "35"
           ],
           "questionId": "3c447a2f5cc6ca1985ce2c81463a3c47"
       },
       {
           "answers": [
               "Male"
           ],
           "questionId": "a6df7c25602939554612ef6de762f5b9"
       },
       {
           "questionId": "2f66155965e60094f23f01af531d5af1",
           "subAnswers": [
               {
                   "questionId": "1dae2d86eef846c967254c9e369170ce"
               },
               {
                   "questionId": "40ffeb4d33dab1fe8d2d8b73c02ed13b"
               },
               {
                   "questionId": "2db1e8b6e97d5baa8935b9b31fcc9648"
               },
               {
                   "questionId": "0f8bb9f91ea8085b4ffb839ee8deabb5"
               },
               {
                   "questionId": "22a93ecb72c50ff8899f8b2937776e51"
               },
               {
                   "questionId": "e5106384790c2be745c952c4b867a0ff"
               }
           ]

           "questionId": "492cf9bd41257ea478c5222fbba06616"
       }
   ],
   "createdAt": "2011-08-19T21:05:36.486+0000",
   "createdBy": "user4",
   "documentType": "Response",
   "ipAddress": "42.110.85.67",
    "location": {
       "latitude": 26.8415613,
       "longitude": 75.8222883,
       "provider": "network"
   },
    "surveyId": "6df022f0f371752167ad4920b38e1c37",
    "published": true
}

And my CouchRest model looks like as follows

class Android < CouchRest::Model::Base
    property :description, String
    property :_id, String
    property :_rev, String
    property :documentType, String

    design do
      view :by_documentType,:map =>"function(doc){if (doc.documentType == 'Survey') {emit(doc._id);}}"
      view :by_createdBy
    end
 end

But when I access by_documentType it's returning nil

Android.find_by_documentType('Survey')

Solution

  • Thanks Friends!

    Finally I found the Answer, I changed my Model as follows

    require 'couchrest_model'
    
    class Android < CouchRest::Model::Base
    
      property :description, String
      property :_id, String
      property :_rev, String
      property :documentType, String
      property :surveyId, String
    
      design do
        view :by_document_type,:map =>"function(doc) {if (doc.documentType == \"Survey\") {emit([doc._id,doc.title], 1);}}",:reduce=>"function(keys, values, rereduce) {return sum(values);}"
        view :by_surveyId,:map =>"function(doc) {emit([doc.surveyId], 1);}",:reduce=>"function(keys, values, rereduce) {return sum(values);}"
      end
    end
    

    And now able to call this view as required. following returns all the documents which has document type 'Survey'

    Android.by_document_type.rows
    

    And Based on Survey ID selection, I can retrieve all documents which belongs to selected survey id, as follows

    Android.by_surveyId.key('Selected Survey ID goes here').rows