Module: DbCharmer::ActiveRecord::Migration::MultiDbMigrations::ClassMethods

Defined in:
lib/db_charmer/active_record/migration/multi_db_migrations.rb

Constant Summary collapse

@@multi_db_names =
{}

Instance Method Summary collapse

Instance Method Details

#db_magic(opts = {}) ⇒ Object

Raises:

  • (ArgumentError)


62
63
64
65
66
67
68
69
70
71
72
73
# File 'lib/db_charmer/active_record/migration/multi_db_migrations.rb', line 62

def db_magic(opts = {})
  # Collect connections from all possible options
  conns = [ opts[:connection], opts[:connections] ]
  conns << shard_connections(opts[:sharded_connection]) if opts[:sharded_connection]

  # Get a unique set of connections
  conns = conns.flatten.compact.uniq
  raise ArgumentError, "No connection name - no magic!" unless conns.any?

  # Save connections
  self.multi_db_names = conns
end

#migrate_with_db_wrapper(direction) ⇒ Object



33
34
35
36
37
38
39
40
41
42
43
# File 'lib/db_charmer/active_record/migration/multi_db_migrations.rb', line 33

def migrate_with_db_wrapper(direction)
  if names = multi_db_names
    names.each do |multi_db_name|
      on_db(multi_db_name) do
        migrate_without_db_wrapper(direction)
      end
    end
  else
    migrate_without_db_wrapper(direction)
  end
end

#multi_db_namesObject



24
25
26
# File 'lib/db_charmer/active_record/migration/multi_db_migrations.rb', line 24

def multi_db_names
  @@multi_db_names[self.name] || @@multi_db_names['ActiveRecord::Migration']
end

#multi_db_names=(names) ⇒ Object



28
29
30
# File 'lib/db_charmer/active_record/migration/multi_db_migrations.rb', line 28

def multi_db_names=(names)
  @@multi_db_names[self.name] = names
end

#on_db(db_name) ⇒ Object



45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
# File 'lib/db_charmer/active_record/migration/multi_db_migrations.rb', line 45

def on_db(db_name)
  name = db_name.is_a?(Hash) ? db_name[:connection_name] : db_name.inspect
  announce "Switching connection to #{name}"
  # Switch connection
  old_proxy = ::ActiveRecord::Base.db_charmer_connection_proxy
  db_name = nil if db_name == :default
  ::ActiveRecord::Base.switch_connection_to(db_name, DbCharmer.connections_should_exist?)
  # Yield the block
  yield
ensure
  # Switch it back
  ::ActiveRecord::Base.verify_active_connections!
  announce "Switching connection back"
  ::ActiveRecord::Base.switch_connection_to(old_proxy)
end

#shard_connections(conn_name) ⇒ Object

Return a list of connections to shards in a sharded connection



76
77
78
79
# File 'lib/db_charmer/active_record/migration/multi_db_migrations.rb', line 76

def shard_connections(conn_name)
  conn = DbCharmer::Sharding.sharded_connection(conn_name)
  conn.shard_connections
end