Class: Carnival::KlassService

Inherits:
Object
  • Object
show all
Defined in:
app/services/carnival/klass_service.rb

Constant Summary collapse

ONE_TO_ONE_RELATION_TYPES =
[:has_one, :belongs_to]

Instance Method Summary collapse

Constructor Details

#initialize(klass) ⇒ KlassService

Returns a new instance of KlassService.



4
5
6
# File 'app/services/carnival/klass_service.rb', line 4

def initialize(klass)
  @klass = klass
end

Dynamic Method Handling

This class handles dynamic methods through the method_missing method

#method_missing(method, *args) ⇒ Object



24
25
26
27
28
29
30
# File 'app/services/carnival/klass_service.rb', line 24

def method_missing(method, *args)
  if method.to_s.index(/^is_a_(.*)_relation\?$/)
    result =  method.to_s.match(/^is_a_(.*)_relation\?$/)
    relation = result[1]
    return relation_type(args[0]) == relation.to_sym
  end
end

Instance Method Details

#extract_namespaceObject



42
43
44
45
46
47
# File 'app/services/carnival/klass_service.rb', line 42

def extract_namespace
  namespace = ""
  arr = @klass.to_s.split("::")
  namespace = arr[0] if arr.size > 1
  namespace
end

#get_association(association) ⇒ Object



62
63
64
# File 'app/services/carnival/klass_service.rb', line 62

def get_association association
  @klass.reflect_on_association(association.to_sym)
end

#get_foreign_key(sym) ⇒ Object



72
73
74
75
76
# File 'app/services/carnival/klass_service.rb', line 72

def get_foreign_key sym
  association = get_association(sym)
  return nil if association.nil?
  association.foreign_key
end


66
67
68
69
70
# File 'app/services/carnival/klass_service.rb', line 66

def get_related_class sym
  association = get_association(sym)
  return nil if association.nil?
  association.klass
end

#is_a_one_to_one_relation?(sym) ⇒ Boolean

Returns:

  • (Boolean)


12
13
14
# File 'app/services/carnival/klass_service.rb', line 12

def is_a_one_to_one_relation?(sym)
  relation_type(sym).try(:in?, ONE_TO_ONE_RELATION_TYPES)
end

#is_namespaced?Boolean

Returns:

  • (Boolean)


49
50
51
# File 'app/services/carnival/klass_service.rb', line 49

def is_namespaced?
  @klass.to_s.split("::").size > 1
end

#klassObject



57
58
59
# File 'app/services/carnival/klass_service.rb', line 57

def klass
  @klass
end


37
38
39
40
# File 'app/services/carnival/klass_service.rb', line 37

def related_class sym
  return nil if !relation?(sym)
  get_related_class(sym).classify
end


32
33
34
35
# File 'app/services/carnival/klass_service.rb', line 32

def related_class_file_name sym
  return nil if !relation?(sym)
  get_related_class(sym).name.pluralize.underscore
end

#relation?(sym) ⇒ Boolean

Returns:

  • (Boolean)


8
9
10
# File 'app/services/carnival/klass_service.rb', line 8

def relation? sym
  !get_association(sym).nil?
end

#relation_type(sym) ⇒ Object



16
17
18
19
20
21
22
# File 'app/services/carnival/klass_service.rb', line 16

def relation_type sym
  return nil if !relation?(sym)
  association = get_association(sym)
  return association.macro if association.macro != :has_many
  return :many_to_many if many_to_many_relation? association
  return :has_many
end

#table_nameObject



53
54
55
# File 'app/services/carnival/klass_service.rb', line 53

def table_name
  @klass.table_name
end