Module: CouchRest::Model::Views::ClassMethods

Defined in:
lib/couchrest/model/views.rb

Instance Method Summary collapse

Instance Method Details

#can_reduce_view?(name) ⇒ Boolean

Check if the view can be reduced by checking to see if it has a reduce function.

Returns:

  • (Boolean)


96
97
98
# File 'lib/couchrest/model/views.rb', line 96

def can_reduce_view?(name)
  design_doc && design_doc.can_reduce_view?(name)
end

#first_from_view(name, *args) ⇒ Object

Find the first entry in the view. If the second parameter is a string it will be used as the key for the request, for example:

Course.first_from_view('by_teacher', 'Fred')

More advanced requests can be performed by providing a hash:

Course.first_from_view('by_teacher', :startkey => 'bbb', :endkey => 'eee')


119
120
121
122
123
124
125
126
127
128
129
# File 'lib/couchrest/model/views.rb', line 119

def first_from_view(name, *args)
  query = {:limit => 1}
  case args.first
  when String, Array
    query.update(args[1]) unless args[1].nil?
    query[:key] = args.first
  when Hash
    query.update(args.first)
  end
  view(name, query).first
end

#has_view?(name) ⇒ Boolean

returns stored defaults if there is a view named this in the design doc

Returns:

  • (Boolean)


90
91
92
# File 'lib/couchrest/model/views.rb', line 90

def has_view?(name)
  design_doc && design_doc.has_view?(name)
end

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

Dispatches to any named view.



101
102
103
104
105
106
107
108
# File 'lib/couchrest/model/views.rb', line 101

def view(name, query={}, &block)
  query = query.dup # Modifications made on copy!
  db = query.delete(:database) || database
  query[:raw] = true if query[:reduce]
  raw = query.delete(:raw)
  save_design_doc(db)
  fetch_view_with_docs(db, name, query, raw, &block)
end

#view_by(*keys) ⇒ Object

Define a CouchDB view. The name of the view will be the concatenation of by and the keys joined by and

Example views:

class Post
  # view with default options
  # query with Post.by_date
  view_by :date, :descending => true

  # view with compound sort-keys
  # query with Post.by_user_id_and_date
  view_by :user_id, :date

  # view with custom map/reduce functions
  # query with Post.by_tags :reduce => true
  view_by :tags,                                                
    :map =>                                                     
      "function(doc) {                                          
        if (doc['model'] == 'Post' && doc.tags) {                   
          doc.tags.forEach(function(tag){                       
            emit(doc.tag, 1);                                   
          });                                                   
        }                                                       
      }",                                                       
    :reduce =>                                                  
      "function(keys, values, rereduce) {                       
        return sum(values);                                     
      }"                                                        
end

view_by :date will create a view defined by this Javascript function:

function(doc) {
  if (doc['model'] == 'Post' && doc.date) {
    emit(doc.date, null);
  }
}

It can be queried by calling Post.by_date which accepts all valid options for CouchRest::Database#view. In addition, calling with the :raw => true option will return the view rows themselves. By default Post.by_date will return the documents included in the generated view.

Calling with :database => [instance of CouchRest::Database] will send the query to a specific database, otherwise it will go to the model’s default database (use_database)

CouchRest::Database#view options can be applied at view definition time as defaults, and they will be curried and used at view query time. Or they can be overridden at query time.

Custom views can be queried with :reduce => true to return reduce results. The default for custom views is to query with :reduce => false.

Views are generated (on a per-model basis) lazily on first-access. This means that if you are deploying changes to a view, the views for that model won’t be available until generation is complete. This can take some time with large databases. Strategies are in the works.

To understand the capabilities of this view system more completely, it is recommended that you read the RSpec file at spec/couchrest/more/extended_doc_spec.rb.



74
75
76
77
78
79
80
81
82
83
84
85
86
87
# File 'lib/couchrest/model/views.rb', line 74

def view_by(*keys)
  return unless auto_update_design_doc

  opts = keys.pop if keys.last.is_a?(Hash)
  opts ||= {}
  ducktype = opts.delete(:ducktype)

  unless ducktype || opts[:map]
    opts[:guards] ||= []
    opts[:guards].push "(doc['#{model_type_key}'] == '#{self.to_s}')"
  end
  keys.push opts
  design_doc.view_by(*keys)
end