Module: LooseChange::Views
- Included in:
- Base
- Defined in:
- lib/loose_change/views.rb
Instance Method Summary collapse
-
#add_view(name, map, reduce = nil) ⇒ Object
Add a view to the this model’s design document on CouchDB.
-
#all(opts = {}) ⇒ Object
Retrieve all of this model’s documents currently stored on CouchDB.
-
#doc_key(key) ⇒ Object
:nodoc:.
-
#existence_check(key) ⇒ Object
:nodoc:.
-
#key_for(keys) ⇒ Object
:nodoc:.
-
#view(view_name, opts = {}) ⇒ Object
Invoke a view identified by
view_nameon this Loose Change model’s design document on CouchDB. -
#view_by(*keys) ⇒ Object
Set up a view that will allow you to query CouchDB by
keys. -
#view_by_all ⇒ Object
:nodoc:.
Instance Method Details
#add_view(name, map, reduce = nil) ⇒ Object
Add a view to the this model’s design document on CouchDB. The view is identified by name, defined by map and optionally reduce, which are composed of JavaScript functions. For more information on CouchDB views, see wiki.apache.org/couchdb/Introduction_to_CouchDB_views
57 58 59 60 61 62 63 64 65 |
# File 'lib/loose_change/views.rb', line 57 def add_view(name, map, reduce = nil) design_doc = JSON.parse(RestClient.get("#{ self.database.uri }/_design/#{ CGI.escape(self.model_name) }")) current_views = design_doc['views'] || {} JSON.parse(RestClient.put("#{ self.database.uri }/_design/#{ CGI.escape(self.model_name) }", { '_id' => design_doc['_id'], '_rev' => design_doc['_rev'], 'language' => 'javascript', 'views' => current_views.merge({name => {'map' => map, 'reduce' => reduce}})}.to_json, default_headers)) end |
#all(opts = {}) ⇒ Object
Retrieve all of this model’s documents currently stored on CouchDB.
48 49 50 |
# File 'lib/loose_change/views.rb', line 48 def all(opts = {}) view(:all, opts.merge!(:include_docs => true)) end |
#doc_key(key) ⇒ Object
:nodoc:
94 95 96 |
# File 'lib/loose_change/views.rb', line 94 def doc_key(key) "doc['#{ key }']" end |
#existence_check(key) ⇒ Object
:nodoc:
80 81 82 |
# File 'lib/loose_change/views.rb', line 80 def existence_check(key) "(#{ doc_key(key) } != null)" end |
#key_for(keys) ⇒ Object
:nodoc:
85 86 87 88 89 90 91 |
# File 'lib/loose_change/views.rb', line 85 def key_for(keys) if keys.length == 1 doc_key(keys.first) else "[#{keys.map {|k| doc_key(k) }.join(',')}]" end end |
#view(view_name, opts = {}) ⇒ Object
Invoke a view identified by view_name on this Loose Change model’s design document on CouchDB. Options specified in the opts hash will be passed along to CouchDB; for options see wiki.apache.org/couchdb/Introduction_to_CouchDB_views
10 11 12 13 14 15 16 |
# File 'lib/loose_change/views.rb', line 10 def view(view_name, opts = {}) opts[:key] = opts.has_key?(:key) ? CGI.escape(opts[:key].to_json) : nil param_string = opts.reject {|k,v| v.nil?}.map {|k,v| "#{k}=#{v}"}.join('&') JSON.parse(RestClient.get("#{ self.database.uri }/_design/#{ CGI.escape(self.model_name) }/_view/#{ view_name }?#{ param_string }", default_headers))['rows'].map do |row| opts[:include_docs] ? instantiate_from_hash(row['doc']) : row['value'] end end |
#view_by(*keys) ⇒ Object
Set up a view that will allow you to query CouchDB by keys. A view will be added to the design document on CouchDB, and a method to retrieve documents will be added to the Loose Change model class.
class Recipe < LooseChange::Base
property :name
property :popularity
view_by :name
view_by :name, :popularity
end
Recipe.by_name("lasagne")
Recipe.by_name_and_popularity("lasagne", 4)
32 33 34 35 36 37 38 39 40 41 42 43 44 45 |
# File 'lib/loose_change/views.rb', line 32 def view_by(*keys) view_name = "by_#{ keys.join('_and_') }" view_code = "function(doc) { if ((doc['model_name'] == '#{ model_name }') && #{ keys.map {|k| existence_check k}.join('&&') }) { emit(#{ key_for(keys) }, null) } } " add_view(view_name, view_code) self.class.send(:define_method, view_name.to_sym) do |*keys| keys = keys.first if keys.length == 1 view(view_name, :key => keys, :include_docs => true) end end |
#view_by_all ⇒ Object
:nodoc:
68 69 70 71 72 73 74 75 76 77 |
# File 'lib/loose_change/views.rb', line 68 def view_by_all view_name = "all" view_code = "function(doc) { if (doc['model_name'] == '#{ model_name }') { emit(null); } } " add_view(view_name, view_code) end |