Module: Protobuf::ActiveRecord::Serialization

Extended by:
ActiveSupport::Concern
Defined in:
lib/protobuf/active_record/serialization.rb

Defined Under Namespace

Modules: ClassMethods

Instance Method Summary collapse

Instance Method Details

#_filter_field_attributes(options = {}) ⇒ Object

:nodoc:



229
230
231
232
233
234
235
236
237
# File 'lib/protobuf/active_record/serialization.rb', line 229

def _filter_field_attributes(options = {})
  options = _normalize_options(options)

  fields = _filtered_fields(options)
  fields &= [ options[:only] ].flatten if options[:only].present?
  fields -= [ options[:except] ].flatten if options[:except].present?

  fields
end

#_filtered_fields(options = {}) ⇒ Object

:nodoc:



240
241
242
243
244
245
246
247
248
249
250
251
# File 'lib/protobuf/active_record/serialization.rb', line 240

def _filtered_fields(options = {})
  include_deprecated = options.fetch(:deprecated, true)

  fields = []
  fields.concat(self.class._protobuf_message_non_deprecated_fields)
  fields.concat(self.class._protobuf_message_deprecated_fields) if include_deprecated
  fields.concat([options[:include]].flatten) if options[:include].present?
  fields.compact!
  fields.uniq!

  fields
end

#_normalize_options(options) ⇒ Object

:nodoc:



254
255
256
257
258
259
260
# File 'lib/protobuf/active_record/serialization.rb', line 254

def _normalize_options(options)
  options ||= {}
  options[:only] ||= [] if options.fetch(:except, false)
  options[:except] ||= [] if options.fetch(:only, false)

  self.class._protobuf_field_options.merge(options)
end

#_protobuf_convert_attributes_to_fields(field, value) ⇒ Object

:nodoc:



317
318
319
# File 'lib/protobuf/active_record/serialization.rb', line 317

def _protobuf_convert_attributes_to_fields(field, value)
  self.class._protobuf_convert_attributes_to_fields(field, value)
end

#_protobuf_field_symbol_transformersObject

:nodoc:



322
323
324
# File 'lib/protobuf/active_record/serialization.rb', line 322

def _protobuf_field_symbol_transformers
  self.class._protobuf_field_symbol_transformers
end

#_protobuf_field_transformersObject

:nodoc:



327
328
329
# File 'lib/protobuf/active_record/serialization.rb', line 327

def _protobuf_field_transformers
  self.class._protobuf_field_transformers
end

#_protobuf_messageObject

:nodoc:



332
333
334
# File 'lib/protobuf/active_record/serialization.rb', line 332

def _protobuf_message
  self.class.protobuf_message
end

#fields_from_record(options = {}) ⇒ Object

Extracts attributes that correspond to fields on the specified protobuf message, performing any necessary column conversions on them. Accepts a hash of options for specifying which fields should be serialized.

Examples:

fields_from_record(:only => [ :guid, :name ])
fields_from_record(:except => :email_domain)
fields_from_record(:include => :email_domain)
fields_from_record(:except => :email_domain, :deprecated => false)


272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
# File 'lib/protobuf/active_record/serialization.rb', line 272

def fields_from_record(options = {})
  hash = {}
  field_attributes = _filter_field_attributes(options)

  # Already flattened / compacted / uniqued ... unless we must include
  if options[:include].present?
    field_attributes.concat([ options[:include] ].flatten)
    field_attributes.compact!
    field_attributes.uniq!
  end

  attribute_number = 0
  limit = field_attributes.size

  # One of the very few places the diff between each/while can make a difference
  # in terms of optimization (`while` is slightly faster as no block carried through)
  while attribute_number < limit
    field = field_attributes[attribute_number]

    begin
      hash[field] = __send__("_protobuf_active_record_serialize_#{field}")
    rescue NoMethodError => error
      raise unless error.message =~ /_protobuf_active_record_serialize/i

      case
      when _protobuf_field_symbol_transformers.has_key?(field) then
        self.class._protobuf_write_symbol_transformer_method(field)
      when _protobuf_field_transformers.has_key?(field) then
        self.class._protobuf_write_field_transformer_method(field)
      when respond_to?(field) then
        self.class._protobuf_write_convert_to_fields_method(field)
      else
        self.class._protobuf_write_nil_method(field)
      end

      hash[field] = __send__("_protobuf_active_record_serialize_#{field}")
    end

    attribute_number += 1
  end

  hash
end

#to_proto(options = {}) ⇒ Object

:nodoc:

Raises:



337
338
339
340
341
342
# File 'lib/protobuf/active_record/serialization.rb', line 337

def to_proto(options = {})
  raise MessageNotDefined.new(self.class) if _protobuf_message.nil?

  fields = self.fields_from_record(options)
  _protobuf_message.new(fields)
end