lib/couchrest/model/proxyable.rb in couchrest_model-1.1.0.beta4 vs lib/couchrest/model/proxyable.rb in couchrest_model-1.1.0.beta5
- old
+ new
@@ -2,38 +2,63 @@
module Model
# :nodoc: Because I like inventing words
module Proxyable
extend ActiveSupport::Concern
+ def proxy_database
+ raise StandardError, "Please set the #proxy_database_method" if self.class.proxy_database_method.nil?
+ @proxy_database ||= self.class.prepare_database(self.send(self.class.proxy_database_method))
+ end
+
module ClassMethods
+
# Define a collection that will use the base model for the database connection
# details.
def proxy_for(assoc_name, options = {})
db_method = options[:database_method] || "proxy_database"
options[:class_name] ||= assoc_name.to_s.singularize.camelize
class_eval <<-EOS, __FILE__, __LINE__ + 1
def #{assoc_name}
- unless respond_to?('#{db_method}')
- raise "Missing ##{db_method} method for proxy"
- end
@#{assoc_name} ||= CouchRest::Model::Proxyable::ModelProxy.new(::#{options[:class_name]}, self, self.class.to_s.underscore, #{db_method})
end
EOS
end
+ # Tell this model which other model to use a base for the database
+ # connection to use.
def proxied_by(model_name, options = {})
raise "Model can only be proxied once or ##{model_name} already defined" if method_defined?(model_name) || !proxy_owner_method.nil?
self.proxy_owner_method = model_name
attr_accessor :model_proxy
attr_accessor model_name
+ overwrite_database_reader(model_name)
end
# Define an a class variable accessor ready to be inherited and unique
# for each Class using the base.
# Perhaps there is a shorter way of writing this.
def proxy_owner_method=(name); @proxy_owner_method = name; end
def proxy_owner_method; @proxy_owner_method; end
+
+ # Define the name of a method to call to determine the name of
+ # the database to use as a proxy.
+ def proxy_database_method(name = nil)
+ @proxy_database_method = name if name
+ @proxy_database_method
+ end
+
+ private
+
+ # Ensure that no attempt is made to autoload a database connection
+ # by overwriting it to provide a basic accessor.
+ def overwrite_database_reader(model_name)
+ class_eval <<-EOS, __FILE__, __LINE__ + 1
+ def self.database
+ raise StandardError, "#{self.to_s} database must be accessed via '#{model_name}' proxy"
+ end
+ EOS
+ end
end
class ModelProxy