Module: SorbetRails::ModelUtils

Extended by:
T::Helpers, T::Sig
Included in:
SorbetRails::ModelPlugins::Base, ModelRbiFormatter
Defined in:
lib/sorbet-rails/model_utils.rb

Overview

typed: strict

Instance Method Summary collapse

Instance Method Details

#add_relation_query_method(root, method_name, parameters: nil) ⇒ Object



69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
# File 'lib/sorbet-rails/model_utils.rb', line 69

def add_relation_query_method(root, method_name, parameters: nil)
  # a relation querying method will be available on
  # - model (as a class method)
  # - activerecord relation
  # - asocciation collection proxy
  # - association relation
  # in case (1) and (2), it returns a Model::ActiveRecord_Relation
  # in case (3) and (4), it returns a Model::ActiveRecord_AssociationRelation

  # force generating these methods because sorbet's hidden-definitions generate & override them
  model_class_rbi = root.create_class(self.model_class_name)
  model_class_rbi.create_method(
    method_name,
    parameters: parameters,
    return_type: self.model_relation_class_name,
    class_method: true,
  )

  model_relation_rbi = root.create_class(self.model_relation_class_name)
  model_relation_rbi.create_method(
    method_name,
    parameters: parameters,
    return_type: self.model_relation_class_name,
  )

  model_assoc_relation_rbi = root.create_class(self.model_assoc_relation_class_name)
  model_assoc_relation_rbi.create_method(
    method_name,
    parameters: parameters,
    return_type: self.model_assoc_relation_class_name,
  )

  collection_proxy_rbi = root.create_class(self.model_assoc_proxy_class_name)
  collection_proxy_rbi.create_method(
    method_name,
    parameters: parameters,
    return_type: self.model_assoc_relation_class_name,
  )
end

#exists_class_method?(method_name) ⇒ Boolean

Returns:

  • (Boolean)


58
59
60
# File 'lib/sorbet-rails/model_utils.rb', line 58

def exists_class_method?(method_name)
  model_class.respond_to?(method_name)
end

#exists_instance_method?(method_name) ⇒ Boolean

Returns:

  • (Boolean)


53
54
55
# File 'lib/sorbet-rails/model_utils.rb', line 53

def exists_instance_method?(method_name)
  model_class.method_defined?(method_name)
end

#model_assoc_proxy_class_nameObject



22
23
24
# File 'lib/sorbet-rails/model_utils.rb', line 22

def model_assoc_proxy_class_name
  "#{model_class.name}::ActiveRecord_Associations_CollectionProxy"
end

#model_assoc_relation_class_nameObject



27
28
29
# File 'lib/sorbet-rails/model_utils.rb', line 27

def model_assoc_relation_class_name
  "#{model_class.name}::ActiveRecord_AssociationRelation"
end

#model_classObject



9
# File 'lib/sorbet-rails/model_utils.rb', line 9

def model_class; end

#model_class_nameObject



12
13
14
# File 'lib/sorbet-rails/model_utils.rb', line 12

def model_class_name
  "#{model_class.name}"
end

#model_module_name(module_name) ⇒ Object



48
49
50
# File 'lib/sorbet-rails/model_utils.rb', line 48

def model_module_name(module_name)
  "#{model_class.name}::#{module_name}"
end

#model_relation_class_nameObject



17
18
19
# File 'lib/sorbet-rails/model_utils.rb', line 17

def model_relation_class_name
  "#{model_class.name}::ActiveRecord_Relation"
end

#model_relation_type_aliasObject



32
33
34
35
36
37
38
39
40
# File 'lib/sorbet-rails/model_utils.rb', line 32

def model_relation_type_alias
  types = [
    self.model_relation_class_name,
    self.model_assoc_proxy_class_name,
    self.model_assoc_relation_class_name
  ].join(', ')

  "T.any(#{types})"
end

#model_relation_type_class_nameObject



43
44
45
# File 'lib/sorbet-rails/model_utils.rb', line 43

def model_relation_type_class_name
  'RelationType'
end