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
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
|
# File 'lib/post_json/base.rb', line 160
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
204
205
206
207
208
209
210
211
|
# File 'lib/post_json/base.rb', line 204
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
213
214
215
216
217
218
|
# File 'lib/post_json/base.rb', line 213
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
257
258
259
260
261
262
263
264
265
266
|
# File 'lib/post_json/base.rb', line 257
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
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
|
# File 'lib/post_json/base.rb', line 289
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
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
|
# File 'lib/post_json/base.rb', line 268
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
196
197
198
199
200
201
202
|
# File 'lib/post_json/base.rb', line 196
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
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
|
# File 'lib/post_json/base.rb', line 229
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
192
193
194
|
# File 'lib/post_json/base.rb', line 192
def page(*args)
all.page(*args)
end
|
.post_json_all ⇒ Object
Also known as:
all
185
186
187
|
# File 'lib/post_json/base.rb', line 185
def post_json_all
QueryTranslator.new(original_all)
end
|
.rename_collection(new_name) ⇒ Object
220
221
222
223
224
225
226
227
|
# File 'lib/post_json/base.rb', line 220
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
128
129
130
|
# File 'lib/post_json/base.rb', line 128
def [](attribute_name)
self.__doc__body_read_attribute(attribute_name)
end
|
#[]=(attribute_name, value) ⇒ Object
132
133
134
|
# File 'lib/post_json/base.rb', line 132
def []=(attribute_name, value)
self.__doc__body_write_attribute(attribute_name, value)
end
|
#__doc__body_attribute_change(attribute_name) ⇒ Object
101
102
103
104
105
106
107
108
|
# File 'lib/post_json/base.rb', line 101
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
97
98
99
|
# File 'lib/post_json/base.rb', line 97
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
93
94
95
|
# File 'lib/post_json/base.rb', line 93
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
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
|
# File 'lib/post_json/base.rb', line 110
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$/
Time.zone.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
83
84
85
86
|
# File 'lib/post_json/base.rb', line 83
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
88
89
90
91
|
# File 'lib/post_json/base.rb', line 88
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
74
75
76
77
78
79
80
81
|
# File 'lib/post_json/base.rb', line 74
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}-#{id}-version-#{__local__unique_version}"
end
|
#respond_to?(method_symbol, include_all = false) ⇒ Boolean
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
|
# File 'lib/post_json/base.rb', line 138
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
136
|
# File 'lib/post_json/base.rb', line 136
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
61
62
63
64
65
66
67
68
69
70
71
72
|
# File 'lib/post_json/base.rb', line 61
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
|