I have a simple model with 3 attributes id
, paylod
(binary data, big), created_at
.
I need to extract a bunch of values from the payload data for further processing which I do in the after_initialize
callback method. As the payload can be quite big (~20MB), I want to dispose this data by setting @payload = nil
after extracting the necessary information to prevent out-of-memory situations when loading a bunch of entries.
Note: The model only reads from the DB, no need to persist any changes.
class Payload < ActiveRecord::Base
after_initialize do |data|
# extract required values from binary data
# ...
# dispose big data
error.payload = nil
# at this point error.changed_attributes['payload']
# contains the previous payload data (~20MB)
end
end
How can I prevent the model of preserving the previous value in the @changed_attributes
hash?
If the attribute setter method is overloaded without calling super()
, all callbacks are disabled and no changes are tracked.
def payload= ( new_payload )
@payload = new_payload
end
In this use-case with a read-only model this works fine. Just be aware that the model also isn't marked dirty either and other side-effects may occur.