CouchRest Casted View: Enable polymorphic CouchDB views

Installation

(depends on couchrest and couchrest_model gems)

Gem

$ gem install couchrest_casted_view

Bundler

Bundler users can add this line to their Gemfile:

gem 'couchrest_casted_view'

Usage

The following is a simple example of using a CouchDB view to load documents of different CouchRest::Model classes, casted automatically:

require 'rubygems'
require 'couchrest_casted_view'

# connect to the CouchDB server
cr = CouchRest.new('http://localhost:5984')
DB = cr.database('casted_test')
# create the database
DB.recreate!

# define a couple of similar document models
class Service < CouchRest::Model::Base
  use_database DB
  property :name
end

class Person < CouchRest::Model::Base
  use_database DB
  property :name
end

# create some documents (services and users)
['Socialiting', 'Window Washing',
 'Keynoting', 'Table Architecture'].each do |name|
  Service.new(:name => name).save!
end

['Zark Muckerberg', 'Gill Bates',
 'Jeve Stobs', 'Ellarry Lison'].each do |name|
  Person.new(:name => name).save!
end

# a simple view that splits the 'name' field
# into words and emits one row per word
DB.save_doc({
  "_id" => "_design/generic",
  :views => {
    :by_word => {
      :map => <<-JS
        function(doc) {
          if (doc.name && doc.name.length > 0) {
            var words = doc.name.split(/\\W/);
            words.forEach(function(word){
              if (word.length > 0) emit(word, 1);
            });
          }
        }
      JS
    } } })

# query the generic view
rows = DB.casted_view('generic/by_word')['rows']

# each returned document should be casted as the
# correct CouchRest::Model class
rows.each do |row|
  doc = row['doc']
  key = row['key']
  value = row['value']
  puts [doc.id, doc.class.to_s, doc.name, key, value].join(', ')
end

Contact

Bugs, suggestions, and such can be posted to https://github.com/m104/couchrest_casted_view/issues.