Module: Sublet::PathResolver

Defined in:
lib/sublet/path_resolver.rb

Class Method Summary collapse

Class Method Details

.resolve_path_to_tenant(klass) ⇒ Object

Walk from klass following declared subletter parents until we find a tenant root (klass._sublet_is_tenant == true). Returns an array of association names (symbols), e.g. [:department, :company] or [] if klass itself is the tenant root.



11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
# File 'lib/sublet/path_resolver.rb', line 11

def resolve_path_to_tenant(klass)
  path = []
  current = klass
  # prevent infinite loops
  seen = {}

  until current.nil? || current._sublet_is_tenant
    return nil unless current.respond_to?(:_subletter_parent) # nothing declared

    parent_assoc = current._subletter_parent
    return nil if parent_assoc.nil?
    return nil if seen[current] # cycle detected

    seen[current] = true

    path << parent_assoc
    # Follow reflection to next klass
    refl = current.reflect_on_association(parent_assoc)
    return nil unless refl

    current = refl.klass
  end

  current&._sublet_is_tenant ? path : nil
end