Module: DbCharmer::ActiveRecord::Sharding
- Defined in:
- lib/db_charmer/active_record/sharding.rb
Class Method Summary collapse
Instance Method Summary collapse
-
#create_with_allocated_shard(key_field = :id, &block) ⇒ Object
The block passed to this function should return an object responding to key_field.
-
#on_default_shard(proxy_target = nil, &block) ⇒ Object
Run on default shard (if supported by the sharding method).
-
#on_each_shard(proxy_target = nil, &block) ⇒ Object
Enumerate shards.
- #shard_for(key, proxy_target = nil, &block) ⇒ Object
Class Method Details
.extended(model) ⇒ Object
5 6 7 |
# File 'lib/db_charmer/active_record/sharding.rb', line 5 def self.extended(model) model.cattr_accessor(:sharded_connection) end |
Instance Method Details
#create_with_allocated_shard(key_field = :id, &block) ⇒ Object
The block passed to this function should return an object responding to key_field
16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
# File 'lib/db_charmer/active_record/sharding.rb', line 16 def create_with_allocated_shard(key_field = :id, &block) sharder = sharded_connection.sharder old_conn = self.db_charmer_allocated_shard_connection self.db_charmer_allocated_shard_connection ||= begin group = sharder.least_loaded_group shard_info = sharder.shard_info_by_group_id(group.id) {:group => group, :shard_info => shard_info, :config => sharder.shard_connection_config(shard_info, group.id)} end # Set global shard connection obj key_obj = on_db(self.db_charmer_allocated_shard_connection[:config], nil, &block) sharder.allocate_new_block_for_key_on_group(key_obj.send(key_field), self.db_charmer_allocated_shard_connection[:group]) if old_conn.nil? self.db_charmer_allocated_shard_connection = old_conn key_obj end |
#on_default_shard(proxy_target = nil, &block) ⇒ Object
Run on default shard (if supported by the sharding method)
32 33 34 35 36 37 38 39 40 |
# File 'lib/db_charmer/active_record/sharding.rb', line 32 def on_default_shard(proxy_target = nil, &block) raise ArgumentError, "No sharded connection configured!" unless sharded_connection if sharded_connection.support_default_shard? shard_for(:default, proxy_target, &block) else raise ArgumentError, "This model's sharding method does not support default shard" end end |
#on_each_shard(proxy_target = nil, &block) ⇒ Object
Enumerate shards
43 44 45 46 47 48 49 50 51 52 |
# File 'lib/db_charmer/active_record/sharding.rb', line 43 def on_each_shard(proxy_target = nil, &block) raise ArgumentError, "No sharded connection configured!" unless sharded_connection conns = sharded_connection.shard_connections raise ArgumentError, "This model's sharding method does not support shards enumeration" unless conns conns.each do |conn| on_db(conn, proxy_target, &block) end end |
#shard_for(key, proxy_target = nil, &block) ⇒ Object
9 10 11 12 13 |
# File 'lib/db_charmer/active_record/sharding.rb', line 9 def shard_for(key, proxy_target = nil, &block) raise ArgumentError, "No sharded connection configured!" unless sharded_connection conn = sharded_connection.sharder.shard_for_key(key) on_db(conn, proxy_target, &block) end |