#### NOTE Work in progress! Not yet used! module CouchRest module Model # A design block in CouchRest Model groups together the functionality of CouchDB's # design documents in a simple block definition. # # class Person < CouchRest::Model::Base # property :name # timestamps! # # design do # view :by_name # end # end # module Designs extend ActiveSupport::Concern module ClassMethods # Add views and other design document features # to the current model. def design(*args, &block) mapper = DesignMapper.new(self) mapper.create_view_method(:all) mapper.instance_eval(&block) if block_given? end # Override the default page pagination value: # # class Person < CouchRest::Model::Base # paginates_per 10 # end # def paginates_per(val) @_default_per_page = val end # The models number of documents to return # by default when performing pagination. # Returns 25 unless explicitly overridden via paginates_per def default_per_page @_default_per_page || 25 end end # class DesignMapper attr_accessor :model def initialize(model) self.model = model end # Generate a method that will provide a new View instance when # requested. This will also define the view in CouchDB unless # auto_update_design_doc is disabled. def view(name, opts = {}) View.create(model, name, opts) if model.auto_update_design_doc create_view_method(name) end # Really simple design function that allows a filter # to be added. Filters are simple functions used when listening # to the _changes feed. # # No methods are created here, the design is simply updated. # See the CouchDB API for more information on how to use this. def filter(name, function) filters = (self.model.design_doc['filters'] ||= {}) filters[name.to_s] = function end def create_view_method(name) model.class_eval <<-EOS, __FILE__, __LINE__ + 1 def self.#{name}(opts = {}) CouchRest::Model::Designs::View.new(self, opts, '#{name}') end EOS end end end end end