lib/database_slave/base.rb in database_slave-0.1.1 vs lib/database_slave/base.rb in database_slave-0.1.2
- old
+ new
@@ -8,9 +8,35 @@
class << self
delegate :using_slave, :using, to: :scoped
end
end
+
+ module ClassMethods
+ # 为了兼容老版本
+ # ActiveRecord::Base.using(:slave_name) do
+ # end
+ # 的写法, 这里迫不得已重写了scoped方法, 目的是:
+ #
+ # 当使用如上方式时, 将其using()方法代理到一个继承了ActiveRecord::Base的
+ # 空的具象类DatabaseSlave::NoneActiveRecord, 以便进而能够使用using方法,
+ # 因为ActiveRecord::Base是一个抽象类, 不能使用using方法.
+ #
+ # 且此种方式只能后接block, 不能用于级联式. 使用级联式会抛出异常, 具体见
+ # ActiveRecord::Relation#using_slave中的实现.
+ #
+ def scoped(options = nil)
+ if self.equal? ActiveRecord::Base
+ # Module.const_get(ActiveRecord::Base.subclasses.map(&:name).sort.first) || self
+ DatabaseSlave::NoneActiveRecord
+ else
+ super
+ end
+ end
+ end
+ end
+
+ class NoneActiveRecord < ActiveRecord::Base
end
end
ActiveRecord::Base.send(:include, DatabaseSlave::Base)