Class: ActiveRecord::MessagePack::Decoder

Inherits:
Object
  • Object
show all
Defined in:
activerecord/lib/active_record/message_pack.rb

Instance Method Summary collapse

Constructor Details

#initialize(entries) ⇒ Decoder

Returns a new instance of Decoder.



91
92
93
94
# File 'activerecord/lib/active_record/message_pack.rb', line 91

def initialize(entries)
  @records = entries.map { |entry| build_record(entry) }
  @records.zip(entries) { |record, entry| resolve_cached_associations(record, entry) }
end

Instance Method Details

#build_record(entry) ⇒ Object



104
105
106
107
108
109
# File 'activerecord/lib/active_record/message_pack.rb', line 104

def build_record(entry)
  class_name, attributes_hash, is_new_record, * = entry
  klass = ActiveSupport::MessagePack::Extensions.load_class(class_name)
  attributes = klass.attributes_builder.build_from_database(attributes_hash)
  klass.allocate.init_with_attributes(attributes, is_new_record)
end

#decode(ref) ⇒ Object



96
97
98
99
100
101
102
# File 'activerecord/lib/active_record/message_pack.rb', line 96

def decode(ref)
  if ref.is_a?(Array)
    ref.map { |r| @records[r] }
  elsif ref
    @records[ref]
  end
end

#resolve_cached_associations(record, entry) ⇒ Object



111
112
113
114
115
116
117
118
119
120
121
# File 'activerecord/lib/active_record/message_pack.rb', line 111

def resolve_cached_associations(record, entry)
  i = 3 # entry == [class_name, attributes_hash, is_new_record, *associations]
  while i < entry.length
    begin
      record.association(entry[i]).target = decode(entry[i + 1])
    rescue ActiveRecord::AssociationNotFoundError
      # The association no longer exists, so just skip it.
    end
    i += 2
  end
end