Class: CouchRest::Design
- Defined in:
- lib/couchrest/core/design.rb
Instance Attribute Summary
Attributes inherited from Document
Instance Method Summary collapse
- #name ⇒ Object
- #name=(newname) ⇒ Object
- #save ⇒ Object
-
#view(view_name, query = {}, &block) ⇒ Object
Dispatches to any named view.
- #view_by(*keys) ⇒ Object
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
Constructor Details
This class inherits a constructor from CouchRest::Response
Instance Method Details
#name ⇒ Object
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 |
#save ⇒ Object
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 |