module Cell::Context::ClassMethods

Public Class Methods

extended(cls) click to toggle source
# File lib/cell/context.rb, line 9
def self.extended(cls)
  cls.include ::ActiveSupport::Callbacks
  cls.define_callbacks :set_tenant, :use_tenant
end

Public Instance Methods

after_set(*args, &block) click to toggle source
# File lib/cell/context.rb, line 14
def after_set(*args, &block)
  set_callback(:set_tenant, :after, *args, &block)
end
around_use(*args, &block) click to toggle source
# File lib/cell/context.rb, line 18
def around_use(*args, &block)
  set_callback(:use_tenant, :around, *args, &block)
end
current() click to toggle source
# File lib/cell/context.rb, line 22
def current
  Thread.current[THREAD_KEY]
end
set!(tenant, exclusive: false) click to toggle source
# File lib/cell/context.rb, line 26
def set!(tenant, exclusive: false)
  Meta.with_schema(tenant.schema_name, exclusive: exclusive)
  set_current(tenant)
  tenant.run_callbacks :set_tenant
  tenant
end
use(tenant, exclusive: false) { |current| ... } click to toggle source
# File lib/cell/context.rb, line 33
def use(tenant, exclusive: false)
  fail ArgumentError, "block required" unless block_given?
  saved_tenant = current

  if tenant
    Meta.with_schema(tenant.schema_name, exclusive: exclusive) do
      set_current(tenant)
      tenant.run_callbacks :use_tenant do
        yield Model.current
      end
    end
  else
    Meta.with_global_schema do
      set_current(nil)
      yield nil
    end
  end

  tenant
ensure
  set_current(saved_tenant)
end

Private Instance Methods

set_current(tenant) click to toggle source
# File lib/cell/context.rb, line 57
def set_current(tenant)
  unless tenant.nil? || tenant.is_a?(Model)
    fail ArgumentError, "Invalid tenant: #{tenant.inspect}"
  end

  Thread.current[THREAD_KEY] = tenant
end