lib/octopus/association.rb in ar-octopus-0.8.0 vs lib/octopus/association.rb in ar-octopus-0.8.1
- old
+ new
@@ -1,10 +1,43 @@
module Octopus::Association
def self.extended(base)
base.send(:include, InstanceMethods)
end
+ module QueryOnCurrentShard
+
+ METHODS= %w[
+ all
+ average
+ count
+ empty?
+ exists?
+ find
+ find_by_sql
+ first
+ last
+ maximum
+ minimum
+ pluck
+ scoping
+ size
+ sum
+ to_a
+ ]
+
+ METHODS.each do |m|
+ define_method m.to_sym do |*args,&block|
+ if self.respond_to?(:proxy_association) and self.proxy_association
+ self.proxy_association.owner.run_on_shard { super(*args, &block) }
+ else
+ super(*args, &block)
+ end
+ end
+ end
+
+ end
+
module InstanceMethods
def set_connection_on_association(record)
return unless ::Octopus.enabled?
return if !self.class.connection.respond_to?(:current_shard) || !self.respond_to?(:current_shard)
if !record.current_shard.nil? && !self.current_shard.nil? && record.current_shard != self.current_shard
@@ -62,9 +95,11 @@
elsif options[:before_remove].is_a?(Symbol)
options[:before_remove] = [:set_connection_on_association, options[:before_remove]]
else
options[:before_remove] = :set_connection_on_association
end
+
+ options[:extend] = [ Octopus::Association::QueryOnCurrentShard, options[:extend] ].flatten.compact
end
end
ActiveRecord::Base.extend(Octopus::Association)