Module: NCore::Associations

Defined in:
lib/ncore/associations.rb

Instance Method Summary collapse

Instance Method Details

#belongs_to(assoc_name, association_key: nil, class_name: nil) ⇒ Object

assoc_name - singular association name :association_key - key on this resource used to reference the parent association

defaults to `assoc_name+'_id'`

:class_name - Module::Class of the parent association, as a string



118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
# File 'lib/ncore/associations.rb', line 118

def belongs_to(assoc_name, association_key: nil, class_name: nil)
  assoc_name = assoc_name.to_s
  parent_key = association_key&.to_s || "#{assoc_name}_id"
  klass      = class_name || "#{module_name}::#{assoc_name.camelize}"

  # attr :parent_id
  # def parent({})
  class_eval "    attr :\#{parent_key}\n    def \#{assoc_name}(params={})\n      return nil unless \#{parent_key}\n      params = parse_request_params(params).reverse_merge credentials: api_creds\n      if params.except(:credentials, :request).empty?\n        # only cache unfiltered, default api call\n        @attribs[:\#{assoc_name}] ||= \#{klass}.find(\#{parent_key}, params)\n      else\n        \#{klass}.find(\#{parent_key}, params)\n      end\n    end\n  P1\n\n  class_eval <<-P2, __FILE__, __LINE__+1\n    def \#{parent_key}=(v)\n      @attribs[:\#{assoc_name}] = nil unless @attribs[:\#{parent_key}] == v\n      @attribs[:\#{parent_key}] = v\n    end\n    private :\#{parent_key}=\n  P2\nend\n", __FILE__, __LINE__+1

#has_many(assoc_name, association_key: nil, class_name: nil) ⇒ Object

assoc_name - plural association name :association_key - key used by the association to reference the parent

defaults to `attrib_name+'_id'`

:class_name - Module::Class of the child association, as a string



8
9
10
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
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
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
108
109
110
111
112
# File 'lib/ncore/associations.rb', line 8

def has_many(assoc_name, association_key: nil, class_name: nil)
  assoc_name = assoc_name.to_s
  parent_key = association_key&.to_s || "#{attrib_name}_id"
  klass      = class_name || "#{module_name}::#{assoc_name.camelize.singularize}"

  # def items({})
  class_eval "    def \#{assoc_name}(params={})\n      return [] unless id\n      reload = params.delete :reload\n      cacheable = params.except(:credentials, :request).empty?\n      params = parse_request_params(params).reverse_merge credentials: api_creds\n      params[:\#{parent_key}] = id\n      if cacheable\n        # only cache unfiltered, default api call\n        @attribs[:\#{assoc_name}] = (!reload && @attribs[:\#{assoc_name}]) || \#{klass}.all(params)\n      else\n        \#{klass}.all(params)\n      end\n    end\n  A1\n\n  # def find_item(id, {})\n  class_eval <<-F1, __FILE__, __LINE__+1\n    def find_\#{assoc_name.singularize}(aid, params={})\n      raise UnsavedObjectError unless id\n      params = parse_request_params(params).reverse_merge credentials: api_creds\n      params[:\#{parent_key}] = id\n      \#{klass}.find(aid, params)\n    end\n  F1\n\n  # def retrieve_item(id, {})\n  class_eval <<-F2, __FILE__, __LINE__+1\n    def retrieve_\#{assoc_name.singularize}(aid, params={})\n      raise UnsavedObjectError unless id\n      params = parse_request_params(params).reverse_merge credentials: api_creds\n      params[:\#{parent_key}] = id\n      \#{klass}.retrieve(aid, params)\n    end\n  F2\n\n  # def create_item({})\n  # will always return the object; check .errors? or .valid? to see how it went\n  class_eval <<-C1, __FILE__, __LINE__+1\n    def create_\#{assoc_name.singularize}(params={})\n      raise UnsavedObjectError unless id\n      params = parse_request_params(params).reverse_merge credentials: api_creds\n      params[:\#{parent_key}] = id\n      \#{klass}.create(params)\n    end\n  C1\n\n  # def create_item!({})\n  class_eval <<-C2, __FILE__, __LINE__+1\n    def create_\#{assoc_name.singularize}!(params={})\n      raise UnsavedObjectError unless id\n      params = parse_request_params(params).reverse_merge credentials: api_creds\n      params[:\#{parent_key}] = id\n      \#{klass}.create!(params)\n    end\n  C2\n\n  # def update_item(id, {})\n  # will always return the object; check .errors? or .valid? to see how it went\n  class_eval <<-U1, __FILE__, __LINE__+1\n    def update_\#{assoc_name.singularize}(aid, params={})\n      raise UnsavedObjectError unless id\n      params = parse_request_params(params).reverse_merge credentials: api_creds\n      params[:\#{parent_key}] = id\n      \#{klass}.update(aid, params)\n    end\n  U1\n\n  # def update_item!(id, {})\n  class_eval <<-U2, __FILE__, __LINE__+1\n    def update_\#{assoc_name.singularize}!(aid, params={})\n      raise UnsavedObjectError unless id\n      params = parse_request_params(params).reverse_merge credentials: api_creds\n      params[:\#{parent_key}] = id\n      \#{klass}.update!(aid, params)\n    end\n  U2\n\n  # def delete_item(id, {})\n  # will always return the object; check .errors? or .valid? to see how it went\n  class_eval <<-D1, __FILE__, __LINE__+1\n    def delete_\#{assoc_name.singularize}(aid, params={})\n      raise UnsavedObjectError unless id\n      params = parse_request_params(params).reverse_merge credentials: api_creds\n      params[:\#{parent_key}] = id\n      \#{klass}.delete(aid, params)\n    end\n  D1\n\n  # def delete_item!(id, {})\n  class_eval <<-D2, __FILE__, __LINE__+1\n    def delete_\#{assoc_name.singularize}!(aid, params={})\n      raise UnsavedObjectError unless id\n      params = parse_request_params(params).reverse_merge credentials: api_creds\n      params[:\#{parent_key}] = id\n      \#{klass}.delete!(aid, params)\n    end\n  D2\nend\n", __FILE__, __LINE__+1