Class: PostJson::Base
Class Method Summary
collapse
Instance Method Summary
collapse
Constructor Details
#initialize(*args) ⇒ Base
Returns a new instance of Base.
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
|
# File 'lib/post_json/base.rb', line 14
def initialize(*args)
if args[0]
__local__doc__body = HashWithIndifferentAccess.new
args[0] = args[0].with_indifferent_access.inject(HashWithIndifferentAccess.new('__doc__body' => {})) do |result, (attribute_name, value)|
if self.class.primary_key == attribute_name
result[attribute_name] = value
result['__doc__body'][attribute_name] = value
elsif self.class.column_names.include?(attribute_name)
result[attribute_name] = value
else
__local__doc__body[attribute_name] = value
end
result
end
super(*args) do |new_record|
__local__doc__body.each do |attribute_name, value|
new_record.public_send("#{attribute_name}=", value)
end
yield new_record if block_given?
end
else
args[0] = HashWithIndifferentAccess.new('__doc__body' => {})
super
end
end
|
Dynamic Method Handling
This class handles dynamic methods through the method_missing method
#method_missing(method_symbol, *args, &block) ⇒ Object
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
|
# File 'lib/post_json/base.rb', line 164
def method_missing(method_symbol, *args, &block)
method_name = method_symbol.to_s
attribute_name = if method_name.end_with?("_changed?")
method_name[0..-10]
elsif method_name.end_with?("_was")
method_name[0..-5]
elsif method_name.end_with?("=")
method_name[0..-2]
elsif method_name.end_with?("_change")
method_name[0..-8]
elsif method_name.end_with?("_will_change!")
method_name[0..-14]
else
method_name
end
if attribute_name.in?(attribute_names) || self.class.column_names.include?(attribute_name) || super_respond_to?(attribute_name.to_sym)
super
else
self.class.define_attribute_accessor(attribute_name)
send(method_symbol, *args)
end
end
|
Class Method Details
.collection_name ⇒ Object
208
209
210
211
212
213
214
215
|
# File 'lib/post_json/base.rb', line 208
def collection_name
if @collection_name == nil
@collection_name = superclass.collection_name rescue nil
end
message = "You need to assign a collection name to \"#{name || 'Class'}.collection_name\""
raise ArgumentError, message unless @collection_name.present?
@collection_name
end
|
.collection_name=(name) ⇒ Object
217
218
219
220
221
222
|
# File 'lib/post_json/base.rb', line 217
def collection_name=(name)
raise ArgumentError, "Collection name must be present" unless name.present?
@collection_name = name.to_s.strip
reload_settings!
@collection_name
end
|
.convert_attribute_value_before_save(primary_key, selector, value) ⇒ Object
261
262
263
264
265
266
267
268
269
270
|
# File 'lib/post_json/base.rb', line 261
def convert_attribute_value_before_save(primary_key, selector, value)
case value
when Time
value.in_time_zone
when DateTime
value.to_time.in_time_zone
else
value
end
end
|
.convert_document_array_before_save(primary_key, document_array, prefix = nil) ⇒ Object
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
|
# File 'lib/post_json/base.rb', line 293
def convert_document_array_before_save(primary_key, document_array, prefix = nil)
if document_array
document_array.map.with_index do |value, index|
selector = "#{prefix}[#{index}]"
case value
when Hash
convert_document_hash_before_save(primary_key, value, selector)
when Array
convert_document_array_before_save(primary_key, value, selector)
else
convert_attribute_value_before_save(primary_key, selector, value)
end
end
end
end
|
.convert_document_hash_before_save(primary_key, document_hash, prefix = nil) ⇒ Object
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
|
# File 'lib/post_json/base.rb', line 272
def convert_document_hash_before_save(primary_key, document_hash, prefix = nil)
if document_hash
document_hash.inject(HashWithIndifferentAccess.new) do |result_hash, (key, value)|
selector = if prefix
"#{prefix}.#{key}"
else
key
end
case value
when Hash
result_hash[key] = convert_document_hash_before_save(primary_key, value, selector)
when Array
result_hash[key] = convert_document_array_before_save(primary_key, value, selector)
else
result_hash[key] = convert_attribute_value_before_save(primary_key, selector, value)
end
result_hash
end
end
end
|
.default_scopes ⇒ Object
200
201
202
203
204
205
206
|
# File 'lib/post_json/base.rb', line 200
def default_scopes
model_settings = ModelSettings.table_name
query = original_all.joins("INNER JOIN \"#{model_settings}\" ON lower(\"#{model_settings}\".collection_name) = '#{collection_name.downcase}'")
query = query.where("\"#{table_name}\".__doc__model_settings_id = \"#{model_settings}\".id")
super + [Proc.new { query }]
end
|
.define_attribute_accessor(attribute_name) ⇒ Object
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
|
# File 'lib/post_json/base.rb', line 233
def define_attribute_accessor(attribute_name)
class_eval <<-RUBY
def #{attribute_name}
__doc__body_read_attribute('#{attribute_name}')
end
def #{attribute_name}=(value)
__doc__body_write_attribute('#{attribute_name}', value)
end
def #{attribute_name}_changed?
__doc__body_attribute_changed?('#{attribute_name}')
end
def #{attribute_name}_was
__doc__body_attribute_was('#{attribute_name}')
end
def #{attribute_name}_change
__doc__body_attribute_change('#{attribute_name}')
end
def #{attribute_name}_will_change!
(__doc__body_will_change! || {})['#{attribute_name}']
end
RUBY
end
|
.page(*args) ⇒ Object
196
197
198
|
# File 'lib/post_json/base.rb', line 196
def page(*args)
all.page(*args)
end
|
.post_json_all ⇒ Object
Also known as:
all
189
190
191
|
# File 'lib/post_json/base.rb', line 189
def post_json_all
QueryTranslator.new(original_all)
end
|
.rename_collection(new_name) ⇒ Object
224
225
226
227
228
229
230
231
|
# File 'lib/post_json/base.rb', line 224
def rename_collection(new_name)
new_name = new_name.to_s.strip
if settings.persisted?
settings.collection_name = new_name
settings.save!
end
@collection_name = new_name
end
|
Instance Method Details
#[](attribute_name) ⇒ Object
132
133
134
|
# File 'lib/post_json/base.rb', line 132
def [](attribute_name)
self.__doc__body_read_attribute(attribute_name)
end
|
#[]=(attribute_name, value) ⇒ Object
136
137
138
|
# File 'lib/post_json/base.rb', line 136
def []=(attribute_name, value)
self.__doc__body_write_attribute(attribute_name, value)
end
|
#__doc__body_attribute_change(attribute_name) ⇒ Object
105
106
107
108
109
110
111
112
|
# File 'lib/post_json/base.rb', line 105
def __doc__body_attribute_change(attribute_name)
__local__change = [__doc__body_attribute_was(attribute_name), __doc__body_read_attribute(attribute_name)]
if __local__change[0] == __local__change[1]
nil
else
__local__change
end
end
|
#__doc__body_attribute_changed?(attribute_name) ⇒ Boolean
101
102
103
|
# File 'lib/post_json/base.rb', line 101
def __doc__body_attribute_changed?(attribute_name)
(self.__doc__body == nil ? nil : self.__doc__body.with_indifferent_access[attribute_name]) != self.__doc__body_attribute_was(attribute_name)
end
|
#__doc__body_attribute_was(attribute_name) ⇒ Object
97
98
99
|
# File 'lib/post_json/base.rb', line 97
def __doc__body_attribute_was(attribute_name)
self.__doc__body_was == nil ? nil : self.__doc__body_was.with_indifferent_access[attribute_name]
end
|
#__doc__body_convert_attribute_type(attribute_name, value) ⇒ Object
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
|
# File 'lib/post_json/base.rb', line 114
def __doc__body_convert_attribute_type(attribute_name, value)
case value
when /^[0-9]{4}-[0-1][0-9]-[0-3][0-9]T[0-2][0-9]:[0-5][0-9]:[0-5][0-9]\.[0-9]{3}Z$/
DateTime.parse(value)
when Hash
value.inject(HashWithIndifferentAccess.new) do |result, (key, value)|
result[key] = __doc__body_convert_attribute_type("#{attribute_name}.#{key}", value)
result
end
when Array
value.map.with_index do |array_value, index|
__doc__body_convert_attribute_type("#{attribute_name}[#{index}]", array_value)
end
else
value
end
end
|
#__doc__body_read_attribute(attribute_name) ⇒ Object
87
88
89
90
|
# File 'lib/post_json/base.rb', line 87
def __doc__body_read_attribute(attribute_name)
__local__value = self.__doc__body[attribute_name.to_s] if self.__doc__body
__doc__body_convert_attribute_type(attribute_name, __local__value)
end
|
#__doc__body_write_attribute(attribute_name, value) ⇒ Object
92
93
94
95
|
# File 'lib/post_json/base.rb', line 92
def __doc__body_write_attribute(attribute_name, value)
self.__doc__body = HashWithIndifferentAccess.new(self.__doc__body).merge(attribute_name.to_s => value)
value
end
|
#attribute_changed?(attribute_name) ⇒ Boolean
78
79
80
81
82
83
84
85
|
# File 'lib/post_json/base.rb', line 78
def attribute_changed?(attribute_name)
attribute_name = attribute_name.to_s
if attribute_name.in?(attribute_names)
super
else
__doc__body_attribute_changed?(attribute_name)
end
end
|
#attributes ⇒ Object
49
50
51
52
53
54
55
|
# File 'lib/post_json/base.rb', line 49
def attributes
if @new_record != nil
(read_attribute('__doc__body') || {}).with_indifferent_access
else
HashWithIndifferentAccess.new
end
end
|
#cache_key ⇒ Object
43
44
45
46
47
|
# File 'lib/post_json/base.rb', line 43
def cache_key
@dashed_name ||= self.class.name.underscore.dasherize
__local__unique_version = __doc__version || Digest::MD5.hexdigest(attributes.inspect)
"#{@dashed_name}-#{self[self.class.primary_key]}-version-#{__local__unique_version}"
end
|
#inspect ⇒ Object
61
62
63
|
# File 'lib/post_json/base.rb', line 61
def inspect
"#<#{self.class.name} #{attributes.map{ |k, v| "#{k}: #{v.inspect}" }.join(", ")}>"
end
|
#respond_to?(method_symbol, include_all = false) ⇒ Boolean
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
|
# File 'lib/post_json/base.rb', line 142
def respond_to?(method_symbol, include_all = false)
if super
true
else
method_name = method_symbol.to_s
attribute_name = if method_name.end_with?("_changed?")
method_name[0..-10]
elsif method_name.end_with?("_was")
method_name[0..-5]
elsif method_name.end_with?("=")
method_name[0..-2]
elsif method_name.end_with?("_change")
method_name[0..-8]
elsif method_name.end_with?("_will_change!")
method_name[0..-14]
else
method_name
end
attributes.has_key?(attribute_name)
end
end
|
#super_respond_to? ⇒ Object
140
|
# File 'lib/post_json/base.rb', line 140
alias_method :super_respond_to?, :respond_to?
|
#to_h ⇒ Object
57
58
59
|
# File 'lib/post_json/base.rb', line 57
def to_h
attributes.deep_dup
end
|
#write_attribute(attribute_name, value) ⇒ Object
65
66
67
68
69
70
71
72
73
74
75
76
|
# File 'lib/post_json/base.rb', line 65
def write_attribute(attribute_name, value)
attribute_name = attribute_name.to_s
if attribute_name == '__doc__body'
value = value.try(:with_indifferent_access)
self.__doc__body_will_change! unless self.__doc__body.try(:with_indifferent_access) == value
super('__doc__body', value)
elsif attribute_name.in?(attribute_names)
super
else
__doc__body_write_attribute(attribute_name, value)
end
end
|