Same as CouchRest::Document but with properties and validations
Accessors
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
Checks if we’re the top document
# File lib/couchrest/extended_document.rb, line 160 def base_doc? !@casted_by end
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
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
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
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
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
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
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
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
Defines an instance and save it directly to the database
returns the reloaded document
# File lib/couchrest/extended_document.rb, line 82 def self.create(options) instance = new(options) instance.create instance end
Defines an instance and save it directly to the database
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
Creates a new instance, bypassing attribute protection
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
# 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
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
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
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
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
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