Sha256: c8238749c998a45657c4669800d3c7e9d0729c5bfd2feb29d8af5bdd843d4267
Contents?: true
Size: 1.91 KB
Versions: 2
Compression:
Stored size: 1.91 KB
Contents
module Octopus module AssociationShardTracking class MismatchedShards < StandardError attr_reader :record, :current_shard def initialize(record, current_shard) @record = record @current_shard = current_shard end def message [ "Association Error: Records are from different shards", "Record: #{record.inspect}", "Current Shard: #{current_shard.inspect}", "Current Record Shard: #{record.current_shard.inspect}", ].join(" ") end end def self.extended(base) base.send(:include, InstanceMethods) end module InstanceMethods def 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? && !current_shard.nil? && record.current_shard != current_shard raise MismatchedShards.new(record, current_shard) end record.current_shard = self.class.connection.current_shard = current_shard if should_set_current_shard? end end def has_many(association_id, scope = nil, options = {}, &extension) if options == {} && scope.is_a?(Hash) default_octopus_opts(scope) else default_octopus_opts(options) end super end def has_and_belongs_to_many(association_id, scope = nil, options = {}, &extension) if options == {} && scope.is_a?(Hash) default_octopus_opts(scope) else default_octopus_opts(options) end super end def default_octopus_opts(options) options[:before_add] = [ :connection_on_association=, options[:before_add] ].compact.flatten options[:before_remove] = [ :connection_on_association=, options[:before_remove] ].compact.flatten end end end ActiveRecord::Base.extend(Octopus::AssociationShardTracking)
Version data entries
2 entries across 2 versions & 1 rubygems
Version | Path |
---|---|
ar-octopus-0.9.1 | lib/octopus/association_shard_tracking.rb |
ar-octopus-0.9.0 | lib/octopus/association_shard_tracking.rb |