class MyStuff::MultiDB::Connection

Public Class Methods

abstract_class?() click to toggle source
# File lib/my_stuff/multidb/connection.rb, line 27
def abstract_class?
  true
end
base_class_for_spec(spec) click to toggle source
# File lib/my_stuff/multidb/connection.rb, line 15
def base_class_for_spec spec
  name = MyStuff::MultiDB::Mangling.mangle(spec).to_sym
  if Connections.const_defined?(name)
    return Connections.const_get(name)
  end

  connection = Class.new(self)
  Connections.const_set(name, connection)
  connection.establish_connection(spec)
  connection
end
rebased_model(name, original_module, rebased_module) click to toggle source
# File lib/my_stuff/multidb/connection.rb, line 41
def rebased_model name, original_module, rebased_module
  if rebased_module.const_defined? name
    rebased_module.const_get(name)
  else
    self.rebase_model! name, original_module, rebased_module
  end
end
rebased_module(original_module) click to toggle source
# File lib/my_stuff/multidb/connection.rb, line 31
def rebased_module original_module
  name = original_module.name.gsub(':', '__').to_sym

  if have_rebased_module?(name)
    self.const_get(name)
  else
    self.rebase_module! name, original_module
  end
end

Protected Class Methods

have_rebased_module?(name) click to toggle source
# File lib/my_stuff/multidb/connection.rb, line 93
def have_rebased_module? name
  # 1.8.7: const_defined? does not include constants defined
  #   in other modules, and it only takes 1 arg
  # 1.9: it does include, and needs a second argument to change
  #   this.
  old_const_defined = self.method(:const_defined?).arity == 1
  new_const_defined = !old_const_defined
  return (
    (old_const_defined && self.const_defined?(name)) ||
    (new_const_defined && self.const_defined?(name, false))
  )
end
rebase_model!(name, original_module, rebased_module) click to toggle source
# File lib/my_stuff/multidb/connection.rb, line 51
def rebase_model! name, original_module, rebased_module
  name = name.to_sym
  original = original_module.const_get(name)

  rebased = Class.new(original)
  rebased_module.const_set(name, rebased)
  rebased.send :include, MyStuff::MultiDB::CoreExt::Base

  # Make associations work.
  rebased.reflect_on_all_associations.each do |reflection|
    rebased.send(
      reflection.macro, # eg :has_one
      reflection.name, # eg :some_table
      reflection.options
    )
  end

  return rebased
end
rebase_module!(name, original_module) click to toggle source
# File lib/my_stuff/multidb/connection.rb, line 71
def rebase_module! name, original_module
  ar_base = self
  rebased = Module.new
  ar_base.const_set(name, rebased)

  # Generate wrapper classes on demand
  def rebased.const_missing (name)
    MyStuff::MultiDB::Connection.rebased_model(
      name,
      muggle,
      magic_database
    )
  end

  # Not using define_singleton_method, as that's not in 1.8.7
  singleton = class << rebased; self; end
  singleton.send(:define_method, :magic_database) { ar_base }
  singleton.send(:define_method, :muggle) { original_module }

  return rebased
end