Class: PostJson::Base

Inherits:
ActiveRecord::Base
  • Object
show all
Includes:
Copyable, DynamicIndexMethods, SettingsMethods
Defined in:
lib/post_json/base.rb

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_nameObject

Raises:

  • (ArgumentError)


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

Raises:

  • (ArgumentError)


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_scopesObject



200
201
202
203
204
205
206
# File 'lib/post_json/base.rb', line 200

def default_scopes
  # query = original_all.where("\"#{table_name}\".__doc__model_settings_id = ?", settings_id)
  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_allObject 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

Returns:

  • (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

Returns:

  • (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

#attributesObject



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_keyObject



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

#inspectObject



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

Returns:

  • (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_hObject



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