Module: MyStuff::MultiDB
- Defined in:
- lib/my_stuff/multidb.rb,
lib/my_stuff/multidb/sharded.rb,
lib/my_stuff/multidb/mangling.rb,
lib/my_stuff/multidb/unsharded.rb,
lib/my_stuff/multidb/connection.rb,
lib/my_stuff/multidb/core_ext/base.rb
Overview
=Example
module Foo class SomeTable < ActiveRecord::Base end include MyStuff::MultiDB::Unsharded end module Bar class SomeTable < ActiveRecord::Base end include MyStuff::MultiDB::Sharded end
Foo.with_master do |db| p db::SomeTable.where(:some_column = 'bar') end Foo.with_slave do |db| p db::SomeTable.where(:some_column = 'bar') end
Bar.with_master_for(id) do |db| p db::SomeTable.where(:some_column = 'bar') end Bar.with_master_for_new do |db| db::SomeTable.new do ... end end Bar.with_slave_for(id) do |db| p db::SomeTable.where(:some_column = 'bar') end
See MyStuff::MultiDB::Unsharded and MyStuff::MultiDB::Sharded
Details
When you call with_*, it:
- Looks for a class called MyStuff::MultiDB::MANGLED_DATABASE_NAME
- If it doesn't exist, it creates a new ActiveRecord::Base subclass
- It then looks for a module within that class with the same name as your module
- If it's not there:
- It creates the module
- It creates a subclass of each of your ActiveRecord definitions within this module
- It delegates connection handling to the database class
- It then returns the database class
So, you end up with an ActiveRecord class like: MyStuff::MultiDB::MANGLED_DATABASE_NAME::YourModule::YourClass
Defined Under Namespace
Modules: Connections, CoreExt, Mangling, Sharded, Unsharded Classes: Connection
Class Method Summary collapse
Class Method Details
.included(othermod) ⇒ Object
:nodoc:
63 64 65 66 67 68 69 |
# File 'lib/my_stuff/multidb.rb', line 63 def self.included othermod # :nodoc: class <<othermod def with_spec spec, &block MyStuff::MultiDB.with_spec(self, spec, &block) end end end |
.with_spec(original_module, spec, &block) ⇒ Object
:nodoc:
71 72 73 74 75 76 77 78 79 80 81 82 |
# File 'lib/my_stuff/multidb.rb', line 71 def self.with_spec original_module, spec, &block # :nodoc: ar_base = Connection.base_class_for_spec(spec) rebased_module = ar_base.rebased_module(original_module) ar_base.connection_pool.with_connection do if block.arity == 1 block.call rebased_module else block.call rebased_module, spec end end end |