Class: CouchPotato::Database

Inherits:
Object
  • Object
show all
Defined in:
lib/couch_potato/database.rb

Defined Under Namespace

Classes: ValidationsFailedError

Instance Method Summary collapse

Constructor Details

#initialize(couchrest_database) ⇒ Database

Returns a new instance of Database.



6
7
8
9
10
11
12
13
# File 'lib/couch_potato/database.rb', line 6

def initialize(couchrest_database)
  @couchrest_database = couchrest_database
  begin
    couchrest_database.info
  rescue RestClient::ResourceNotFound
    raise "Database '#{couchrest_database.name}' does not exist."
  end
end

Instance Method Details

#couchrest_databaseObject

returns the underlying CouchRest::Database instance



123
124
125
# File 'lib/couch_potato/database.rb', line 123

def couchrest_database
  @couchrest_database
end

#destroy_document(document) ⇒ Object Also known as: destroy



91
92
93
94
95
96
97
98
# File 'lib/couch_potato/database.rb', line 91

def destroy_document(document)
  document.run_callbacks :destroy do
    document._deleted = true
    couchrest_database.delete_doc document.to_hash
  end
  document._id = nil
  document._rev = nil
end

#first(spec) ⇒ Object

returns the first result from a #view query or nil



65
66
67
# File 'lib/couch_potato/database.rb', line 65

def first(spec)
  view(spec).first
end

#first!(spec) ⇒ Object

returns th first result from a #view or raises CouchPotato::NotFound



70
71
72
# File 'lib/couch_potato/database.rb', line 70

def first!(spec)
  first(spec) || raise(CouchPotato::NotFound)
end

#inspectObject

:nodoc:



118
119
120
# File 'lib/couch_potato/database.rb', line 118

def inspect #:nodoc:
  "#<CouchPotato::Database @root=\"#{couchrest_database.root}\">"
end

#load!(id) ⇒ Object



114
115
116
# File 'lib/couch_potato/database.rb', line 114

def load!(id)
  load(id) || raise(CouchPotato::NotFound)
end

#load_document(id) ⇒ Object Also known as: load

loads a document by its id



102
103
104
105
106
107
108
109
110
111
# File 'lib/couch_potato/database.rb', line 102

def load_document(id)
  raise "Can't load a document without an id (got nil)" if id.nil?
  begin
    instance = couchrest_database.get(id)
    instance.database = self
    instance
  rescue(RestClient::ResourceNotFound)
    nil
  end
end

#save_document(document, validate = true) ⇒ Object Also known as: save

saves a document. returns true on success, false on failure



75
76
77
78
79
80
81
82
# File 'lib/couch_potato/database.rb', line 75

def save_document(document, validate = true)
  return true unless document.dirty? || document.new?
  if document.new?
    create_document(document, validate)
  else
    update_document(document, validate)
  end
end

#save_document!(document) ⇒ Object Also known as: save!

saves a document, raises a CouchPotato::Database::ValidationsFailedError on failure



86
87
88
# File 'lib/couch_potato/database.rb', line 86

def save_document!(document)
  save_document(document) || raise(ValidationsFailedError.new(document.errors.full_messages))
end

#view(spec) ⇒ Object

executes a view and return the results. you pass in a view spec which is usually a result of a SomePersistentClass.some_view call. also return the total_rows returned by CouchDB as an accessor on the results.

Example:

class User
  include CouchPotato::Persistence
  property :age
  view :all, key: :age
end
db = CouchPotato.database

db.view(User.all) # => [user1, user2]
db.view(User.all).total_rows # => 2

You can pass the usual parameters you can pass to a couchdb view to the view:

db.view(User.all(limit: 5, startkey: 2, reduce: false))

For your convenience when passing a hash with only a key parameter you can just pass in the value

db.view(User.all(key: 1)) == db.view(User.all(1))

Instead of passing a startkey and endkey you can pass in a key with a range:

db.view(User.all(key: 1..20)) == db.view(startkey: 1, endkey: 20) == db.view(User.all(1..20))

You can also pass in multiple keys:

db.view(User.all(keys: [1, 2, 3]))


46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
# File 'lib/couch_potato/database.rb', line 46

def view(spec)
  results = CouchPotato::View::ViewQuery.new(
    couchrest_database,
    spec.design_document,
    {spec.view_name => {
      :map => spec.map_function,
      :reduce => spec.reduce_function}
    },
    ({spec.list_name => spec.list_function} unless spec.list_name.nil?)
  ).query_view!(spec.view_parameters)
  processed_results = spec.process_results results
  processed_results.instance_eval "def total_rows; #{results['total_rows']}; end" if results['total_rows']
  processed_results.each do |document|
    document.database = self if document.respond_to?(:database=)
  end if processed_results.respond_to?(:each)
  processed_results
end