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
-
#_filter_field_attributes(options = {}) ⇒ Object
:nodoc:.
-
#_filtered_fields(options = {}) ⇒ Object
:nodoc:.
-
#_normalize_options(options) ⇒ Object
:nodoc:.
-
#_protobuf_convert_attributes_to_fields(field, value) ⇒ Object
:nodoc:.
-
#_protobuf_field_symbol_transformers ⇒ Object
:nodoc:.
-
#_protobuf_field_transformers ⇒ Object
:nodoc:.
-
#_protobuf_message ⇒ Object
:nodoc:.
-
#fields_from_record(options = {}) ⇒ Object
Extracts attributes that correspond to fields on the specified protobuf message, performing any necessary column conversions on them.
-
#to_proto(options = {}) ⇒ Object
:nodoc:.
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( = {}) = () fields = _filtered_fields() fields &= [ [:only] ].flatten if [:only].present? fields -= [ [:except] ].flatten if [: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( = {}) include_deprecated = .fetch(:deprecated, true) fields = [] fields.concat(self.class.) fields.concat(self.class.) if include_deprecated fields.concat([[:include]].flatten) if [: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 () ||= {} [:only] ||= [] if .fetch(:except, false) [:except] ||= [] if .fetch(:only, false) self.class..merge() 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_transformers ⇒ Object
: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_transformers ⇒ Object
:nodoc:
327 328 329 |
# File 'lib/protobuf/active_record/serialization.rb', line 327 def _protobuf_field_transformers self.class._protobuf_field_transformers end |
#_protobuf_message ⇒ Object
:nodoc:
332 333 334 |
# File 'lib/protobuf/active_record/serialization.rb', line 332 def self.class. 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( = {}) hash = {} field_attributes = _filter_field_attributes() # Already flattened / compacted / uniqued ... unless we must include if [:include].present? field_attributes.concat([ [: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. =~ /_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:
337 338 339 340 341 342 |
# File 'lib/protobuf/active_record/serialization.rb', line 337 def to_proto( = {}) raise MessageNotDefined.new(self.class) if .nil? fields = self.fields_from_record() .new(fields) end |