class CouchRest::ExtendedDocument

Same as CouchRest::Document but with properties and validations

Constants

VERSION

Attributes

casted_by[RW]

Accessors

Public Instance Methods

base_doc() click to toggle source

Gets a reference to the actual document in the DB Calls up to the next document if there is one, Otherwise we’re at the top and we return self

# File lib/couchrest/extended_document.rb, line 154
def base_doc
  return self if base_doc?
  @casted_by.base_doc
end
base_doc?() click to toggle source

Checks if we’re the top document

# File lib/couchrest/extended_document.rb, line 160
def base_doc?
  !@casted_by
end
create(bulk = false) click to toggle source

Trigger the callbacks (before, after, around) and create the document It’s important to have a create callback since you can’t check if a document was new after you saved it

When creating a document, both the create and the save callbacks will be triggered.

# File lib/couchrest/extended_document.rb, line 174
def create(bulk = false)
  caught = catch(:halt)  do
    _run_create_callbacks do
        _run_save_callbacks do
          create_without_callbacks(bulk)
      end
    end
  end
end
create!() click to toggle source

Creates the document in the db. Raises an exception if the document is not created properly.

# File lib/couchrest/extended_document.rb, line 194
def create!
  raise "#{self.inspect} failed to save" unless self.create
end
create_without_callbacks(bulk =false) click to toggle source

unlike save, create returns the newly created document

# File lib/couchrest/extended_document.rb, line 185
def create_without_callbacks(bulk =false)
  raise ArgumentError, "a document requires a database to be created to (The document or the #{self.class} default database were not set)" unless database
  set_unique_id if new? && self.respond_to?(:set_unique_id)
  result = database.save_doc(self, bulk)
  (result["ok"] == true) ? self : false
end
destroy(bulk=false) click to toggle source

Deletes the document from the database. Runs the :destroy callbacks. Removes the _id and _rev fields, preparing the document to be saved to a new _id.

# File lib/couchrest/extended_document.rb, line 247
def destroy(bulk=false)
  caught = catch(:halt)  do
    _run_destroy_callbacks do
      result = database.delete_doc(self, bulk)
      if result['ok']
        self.delete('_rev')
        self.delete('_id')
      end
      result['ok']
    end
  end
end
save(bulk = false) click to toggle source

Trigger the callbacks (before, after, around) and save the document

# File lib/couchrest/extended_document.rb, line 216
def save(bulk = false)
  caught = catch(:halt)  do
    if self.new?
      _run_save_callbacks do
        save_without_callbacks(bulk)
      end
    else
      update(bulk)
    end
  end
end
save!() click to toggle source

Saves the document to the db using save. Raises an exception if the document is not saved properly.

# File lib/couchrest/extended_document.rb, line 239
def save!
  raise "#{self.inspect} failed to save" unless self.save
  true
end
save_without_callbacks(bulk = false) click to toggle source

Overridden to set the unique ID. Returns a boolean value

# File lib/couchrest/extended_document.rb, line 230
def save_without_callbacks(bulk = false)
  raise ArgumentError, "a document requires a database to be saved to (The document or the #{self.class} default database were not set)" unless database
  set_unique_id if new? && self.respond_to?(:set_unique_id)
  result = database.save_doc(self, bulk)
  result["ok"] == true
end
update(bulk = false) click to toggle source

Trigger the callbacks (before, after, around) only if the document isn’t new

# File lib/couchrest/extended_document.rb, line 200
def update(bulk = false)
  caught = catch(:halt)  do
    if self.new?
      save(bulk)
    else
      _run_update_callbacks do
        _run_save_callbacks do
          save_without_callbacks(bulk)
        end
      end
    end
  end
end

Public Class Methods

create(options) click to toggle source

Defines an instance and save it directly to the database

Returns

returns the reloaded document
# File lib/couchrest/extended_document.rb, line 82
def self.create(options)
  instance = new(options)
  instance.create
  instance
end
create!(options) click to toggle source

Defines an instance and save it directly to the database

Returns

returns the reloaded document or raises an exception
# File lib/couchrest/extended_document.rb, line 92
def self.create!(options)
  instance = new(options)
  instance.create!
  instance
end
create_from_database(doc = {}) click to toggle source

Creates a new instance, bypassing attribute protection

Returns

a document instance
# File lib/couchrest/extended_document.rb, line 56
def self.create_from_database(doc = {})
  base = (doc['couchrest-type'].blank? || doc['couchrest-type'] == self.to_s) ? self : doc['couchrest-type'].constantize
  base.new(doc, :directly_set_attributes => true)      
end
inherited(subklass) click to toggle source
# File lib/couchrest/extended_document.rb, line 30
    def self.inherited(subklass)
      super
      subklass.send(:include, CouchRest::Mixins::Properties)
      subklass.class_eval "        def self.inherited(subklass)
          super
          subklass.properties = self.properties.dup
        end
", __FILE__, __LINE__ + 1
      subclasses << subklass
    end
method_missing(m, *args, &block) click to toggle source

Temp solution to make the view_by methods available

# File lib/couchrest/extended_document.rb, line 135
def self.method_missing(m, *args, &block)
  if has_view?(m)
    query = args.shift || {}
    return view(m, query, *args, &block)
  elsif m.to_s =~ /^find_(by_.+)/
    view_name = $1
    if has_view?(view_name)
      query = {:key => args.first, :limit => 1}
      return view(view_name, query).first
    end
  end
  super
end
new(doc = {}, options = {}) click to toggle source

Instantiate a new ExtendedDocument by preparing all properties using the provided document hash.

Options supported:

  • :directly_set_attributes: true when data comes directly from database

# File lib/couchrest/extended_document.rb, line 69
def initialize(doc = {}, options = {})
  prepare_all_attributes(doc, options) # defined in CouchRest::Mixins::Attributes
  super(doc)
  unless self['_id'] && self['_rev']
    self['couchrest-type'] = self.class.to_s
  end
  after_initialize if respond_to?(:after_initialize)
end
subclasses() click to toggle source
Including validation here does not work due to the way inheritance is handled.

include CouchRest::Validation

# File lib/couchrest/extended_document.rb, line 26
def self.subclasses
  @subclasses ||= []
end
timestamps!() click to toggle source

Automatically set updated_at and created_at fields on the document whenever saving occurs. CouchRest uses a pretty decent time format by default. See Time#to_json

# File lib/couchrest/extended_document.rb, line 101
    def self.timestamps!
      class_eval "        property(:updated_at, Time, :read_only => true, :protected => true, :auto_validation => false)
        property(:created_at, Time, :read_only => true, :protected => true, :auto_validation => false)
        
        set_callback :save, :before do |object|
          write_attribute('updated_at', Time.now)
          write_attribute('created_at', Time.now) if object.new?
        end
", __FILE__, __LINE__
    end
unique_id(method = nil, &block) click to toggle source

Name a method that will be called before the document is first saved, which returns a string to be used for the document’s _id. Because CouchDB enforces a constraint that each id must be unique, this can be used to enforce eg: uniq usernames. Note that this id must be globally unique across all document types which share a database, so if you’d like to scope uniqueness to this class, you should use the class name as part of the unique id.

# File lib/couchrest/extended_document.rb, line 120
def self.unique_id method = nil, &block
  if method
    define_method :set_unique_id do
      self['_id'] ||= self.send(method)
    end
  elsif block
    define_method :set_unique_id do
      uniqid = block.call(self)
      raise ArgumentError, "unique_id block must not return nil" if uniqid.nil?
      self['_id'] ||= uniqid
    end
  end
end