Add .count to extended documents to return how many there are.
Adds a reduce function to the default view so that an extra view doesn't have to be maintained just for the counting.
This commit is contained in:
parent
e538a3881d
commit
eb160e3141
|
@ -35,8 +35,11 @@ module CouchRest
|
||||||
'all' => {
|
'all' => {
|
||||||
'map' => "function(doc) {
|
'map' => "function(doc) {
|
||||||
if (doc['couchrest-type'] == '#{self.to_s}') {
|
if (doc['couchrest-type'] == '#{self.to_s}') {
|
||||||
emit(null,null);
|
emit(null,1);
|
||||||
}
|
}
|
||||||
|
}",
|
||||||
|
'reduce' => "function(keys, values) {
|
||||||
|
return sum(values);
|
||||||
}"
|
}"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,9 +12,18 @@ module CouchRest
|
||||||
# name of the current class. Take the standard set of
|
# name of the current class. Take the standard set of
|
||||||
# CouchRest::Database#view options.
|
# CouchRest::Database#view options.
|
||||||
def all(opts = {}, &block)
|
def all(opts = {}, &block)
|
||||||
view(:all, opts, &block)
|
view(:all, {:reduce => false}.merge(opts), &block)
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# Returns the number of documents that have the "couchrest-type" field
|
||||||
|
# equal to the name of the current class. Takes the standard set of
|
||||||
|
# CouchRest::Database#view options
|
||||||
|
def count(opts = {}, &block)
|
||||||
|
result = all({:reduce => true}.merge(opts), &block)['rows']
|
||||||
|
return 0 if result.empty?
|
||||||
|
result.first['value']
|
||||||
|
end
|
||||||
|
|
||||||
# Load the first document that have the "couchrest-type" field equal to
|
# Load the first document that have the "couchrest-type" field equal to
|
||||||
# the name of the current class.
|
# the name of the current class.
|
||||||
#
|
#
|
||||||
|
|
|
@ -241,7 +241,25 @@ describe "ExtendedDocument" do
|
||||||
rs.length.should == 4
|
rs.length.should == 4
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
describe "counting all instances of a model" do
|
||||||
|
before(:each) do
|
||||||
|
@db = reset_test_db!
|
||||||
|
end
|
||||||
|
|
||||||
|
it ".count should return 0 if there are no docuemtns" do
|
||||||
|
WithTemplateAndUniqueID.count.should == 0
|
||||||
|
end
|
||||||
|
|
||||||
|
it ".count should return the number of documents" do
|
||||||
|
WithTemplateAndUniqueID.new('important-field' => '1').save
|
||||||
|
WithTemplateAndUniqueID.new('important-field' => '2').save
|
||||||
|
WithTemplateAndUniqueID.new('important-field' => '3').save
|
||||||
|
|
||||||
|
WithTemplateAndUniqueID.count.should == 3
|
||||||
|
end
|
||||||
|
end
|
||||||
|
|
||||||
describe "finding the first instance of a model" do
|
describe "finding the first instance of a model" do
|
||||||
before(:each) do
|
before(:each) do
|
||||||
@db = reset_test_db!
|
@db = reset_test_db!
|
||||||
|
|
Loading…
Reference in a new issue