Class: CouchRest::Design

Inherits:
Document show all
Defined in:
lib/couchrest/core/design.rb

Instance Attribute Summary

Attributes inherited from Document

#database

Instance Method Summary collapse

Methods inherited from Document

#copy, #destroy, #id, #move, #new_document?, #rev, #uri, use_database

Methods included from Mixins::Attachments

#delete_attachment, #fetch_attachment, #put_attachment

Methods inherited from Response

#[], #[]=, #initialize

Constructor Details

This class inherits a constructor from CouchRest::Response

Instance Method Details

#nameObject



45
46
47
# File 'lib/couchrest/core/design.rb', line 45

def name
  id.sub('_design/','') if id
end

#name=(newname) ⇒ Object



49
50
51
# File 'lib/couchrest/core/design.rb', line 49

def name= newname
  self['_id'] = "_design/#{newname}"
end

#saveObject

Raises:

  • (ArgumentError)


53
54
55
56
# File 'lib/couchrest/core/design.rb', line 53

def save
  raise ArgumentError, "_design docs require a name" unless name && name.length > 0
  super
end

#view(view_name, query = {}, &block) ⇒ Object

Dispatches to any named view.



38
39
40
41
42
43
# File 'lib/couchrest/core/design.rb', line 38

def view view_name, query={}, &block
  view_name = view_name.to_s
  view_slug = "#{name}/#{view_name}"
  defaults = (self['views'][view_name] && self['views'][view_name]["couchrest-defaults"]) || {}
  fetch_view(view_slug, defaults.merge(query), &block)
end

#view_by(*keys) ⇒ Object



3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/couchrest/core/design.rb', line 3

def view_by *keys
  opts = keys.pop if keys.last.is_a?(Hash)
  opts ||= {}
  self['views'] ||= {}
  method_name = "by_#{keys.join('_and_')}"
  
  if opts[:map]
    view = {}
    view['map'] = opts.delete(:map)
    if opts[:reduce]
      view['reduce'] = opts.delete(:reduce)
      opts[:reduce] = false
    end
    self['views'][method_name] = view
  else
    doc_keys = keys.collect{|k|"doc['#{k}']"} # this is where :require => 'doc.x == true' would show up
    key_emit = doc_keys.length == 1 ? "#{doc_keys.first}" : "[#{doc_keys.join(', ')}]"
    guards = opts.delete(:guards) || []
    guards.concat doc_keys
    map_function = <<-JAVASCRIPT
function(doc) {
  if (#{guards.join(' && ')}) {
emit(#{key_emit}, null);
  }
}
JAVASCRIPT
    self['views'][method_name] = {
      'map' => map_function
    }
  end
  self['views'][method_name]['couchrest-defaults'] = opts unless opts.empty?
  method_name
end