lib/couchrest/model/proxyable.rb in couchrest_model-2.1.0.rc1 vs lib/couchrest/model/proxyable.rb in couchrest_model-2.2.0.beta1
- old
+ new
@@ -2,28 +2,34 @@
module Model
# :nodoc: Because I like inventing words
module Proxyable
extend ActiveSupport::Concern
- def proxy_database
+ def proxy_database(assoc_name)
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))
+ db_name = self.send(self.class.proxy_database_method)
+ db_suffix = self.class.proxy_database_suffixes[assoc_name.to_sym]
+ @proxy_databases ||= {}
+ @proxy_databases[assoc_name.to_sym] ||= self.class.prepare_database([db_name, db_suffix].compact.reject(&:blank?).join(self.class.connection[:join]))
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"
+ db_method = (options[:database_method] || "proxy_database").to_sym
+ db_suffix = options[:database_suffix] || (options[:use_suffix] ? assoc_name.to_s : nil)
options[:class_name] ||= assoc_name.to_s.singularize.camelize
proxy_method_names << assoc_name.to_sym unless proxy_method_names.include?(assoc_name.to_sym)
proxied_model_names << options[:class_name] unless proxied_model_names.include?(options[:class_name])
+ proxy_database_suffixes[assoc_name.to_sym] = db_suffix
+ db_method_call = "#{db_method}(:#{assoc_name.to_s})"
class_eval <<-EOS, __FILE__, __LINE__ + 1
def #{assoc_name}
- @#{assoc_name} ||= CouchRest::Model::Proxyable::ModelProxy.new(::#{options[:class_name]}, self, self.class.to_s.underscore, #{db_method})
+ @#{assoc_name} ||= CouchRest::Model::Proxyable::ModelProxy.new(::#{options[:class_name]}, self, self.class.to_s.underscore, #{db_method_call})
end
EOS
end
# Tell this model which other model to use as a base for the database
@@ -55,10 +61,14 @@
def proxied_model_names
@proxied_model_names ||= []
end
+ def proxy_database_suffixes
+ @proxy_database_suffixes ||= {}
+ 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)
@@ -154,9 +164,15 @@
proxy_update(doc)
yield doc if block_given?
end
end
+ private
+
+ def method_missing(m, *args, &block)
+ model.respond_to?(m) ? model.send(m, self, *args, &block) : super
+ end
+
end
end
end
end