lib/couchrest/model/proxyable.rb in couchrest_model-1.1.2 vs lib/couchrest/model/proxyable.rb in couchrest_model-1.2.0.beta
- old
+ new
@@ -68,10 +68,12 @@
def initialize(model, owner, owner_name, database)
@model = model
@owner = owner
@owner_name = owner_name
@database = database
+
+ create_view_methods
end
# Base
def new(attrs = {}, options = {}, &block)
proxy_block_update(:new, attrs, options, &block)
@@ -79,80 +81,44 @@
def build_from_database(attrs = {}, options = {}, &block)
proxy_block_update(:build_from_database, attrs, options, &block)
end
- def method_missing(m, *args, &block)
- if has_view?(m)
- if model.respond_to?(m)
- return model.send(m, *args).proxy(self)
- else
- query = args.shift || {}
- return view(m, query, *args, &block)
- end
- elsif m.to_s =~ /^find_(by_.+)/
- view_name = $1
- if has_view?(view_name)
- return first_from_view(view_name, *args)
- end
- end
- super
- end
+ # From DocumentQueries (The old fashioned way)
- # DocumentQueries
-
- def all(opts = {}, &block)
- proxy_update_all(@model.all({:database => @database}.merge(opts), &block))
- end
-
def count(opts = {})
- @model.count({:database => @database}.merge(opts))
+ all(opts).count
end
def first(opts = {})
- proxy_update(@model.first({:database => @database}.merge(opts)))
+ all(opts).first
end
def last(opts = {})
- proxy_update(@model.last({:database => @database}.merge(opts)))
+ all(opts).last
end
def get(id)
proxy_update(@model.get(id, @database))
end
alias :find :get
- # Views
+ protected
- def has_view?(view)
- @model.has_view?(view)
+ def create_view_methods
+ model.design_docs.each do |doc|
+ doc.view_names.each do |name|
+ class_eval <<-EOS, __FILE__, __LINE__ + 1
+ def #{name}(opts = {})
+ model.#{name}({:proxy => self}.merge(opts))
+ end
+ def find_#{name}(*key)
+ #{name}.key(*key).first()
+ end
+ EOS
+ end
+ end
end
-
- def view_by(*args)
- @model.view_by(*args)
- end
-
- def view(name, query={}, &block)
- proxy_update_all(@model.view(name, {:database => @database}.merge(query), &block))
- end
-
- def first_from_view(name, *args)
- # add to first hash available, or add to end
- (args.last.is_a?(Hash) ? args.last : (args << {}).last)[:database] = @database
- proxy_update(@model.first_from_view(name, *args))
- end
-
- # DesignDoc
- def design_doc
- @model.design_doc
- end
-
- def save_design_doc(db = nil)
- @model.save_design_doc(db || @database)
- end
-
-
- protected
# Update the document's proxy details, specifically, the fields that
# link back to the original document.
def proxy_update(doc)
if doc && doc.is_a?(model)