lib/database_slave/relation.rb in database_slave-0.1.3 vs lib/database_slave/relation.rb in database_slave-0.1.4
- old
+ new
@@ -22,12 +22,18 @@
end
def using_slave(slave_name)
if Settings.using_slave
if block_given?
- name = "DatabaseSlave::ConnectionHandler::#{slave_name.to_s.strip.camelize}"
- ActiveRecord::Relation.class_variable_set(:@@slave_block_given, name)
+ db_name = "DatabaseSlave::ConnectionHandler::#{slave_name.to_s.strip.camelize}"
+ unless ActiveRecord::Base.slave_connections.include? db_name
+ raise DatabaseSlave::SlaveConnectionNotExists,
+ "#{slave_name} is not exists."
+ end
+
+ ActiveRecord::Relation.class_variable_set(:@@slave_block_given, db_name)
+ DatabaseSlave::RuntimeRegistry.current_slave_name ||= db_name
begin
yield
ensure
ActiveRecord::Relation.class_variable_set(:@@slave_block_given, nil)
DatabaseSlave::RuntimeRegistry.current_slave_name = nil
@@ -152,9 +158,19 @@
end
else
super
end
end if defined?(Rails)
+
+ # junk hack:
+ # except会重新生成一个ActiveRecord::Relation对象, 所以except之前的using_slave就会失效,
+ # 这里hack一下添加进来.
+ # (主要是为了解决kaminari分页时total_count仍然查询的是主库的问题.)
+ def except(*skips)
+ slave_name_snake = slave_name.to_s.underscore.split('/').last
+ return super if slave_name_snake.blank?
+ using_slave? ? super.using(slave_name_snake.to_sym) : super
+ end
end
def self.prepended(klass)
klass.send :prepend, Relation
end