我有一个简单的模型,包含3个属性id
,paylod
(二进制数据,大数据),created_at
。
我需要从有效负载数据中提取一堆值,以便我在after_initialize
回调方法中进行进一步处理。由于有效负载可能非常大(约20MB),我想在提取必要信息后设置@payload = nil
来处理这些数据,以防止在加载一堆条目时出现内存不足的情况。
注意:该模型仅从数据库中读取,无需保留任何更改。
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
如何阻止保留@changed_attributes
哈希值中的先前值的模型?
答案 0 :(得分:1)
将clear_changes_information
设置为nil后调用payload
。当然,只有在您不希望保留其他更改时,此方法才有效。
示例:
> user.name
=> "Dave Smith"
> user.name = nil
=> nil
> user.changes
=> {"name"=>["Dave Smith", nil]}
> user.clear_changes_information
=> {}
> user.changes
=> {}
此外,还有这种方法restore_attributes
注意,我使用的是ActiveRecord 4.2.4。
答案 1 :(得分:1)
如果属性设置器方法超载没有调用super()
,则会禁用所有回调并且不会跟踪任何更改。
def payload= ( new_payload )
@payload = new_payload
end
在这个只读模型的用例中,这很好用。请注意,该模型也没有标记为脏,并且可能会出现其他副作用。
答案 2 :(得分:0)
您如何看待不同的方法?我的意思是你打电话给Active Job工作人员,通过调用Service Object来完成一些工作。最后这个将对您的数据进行操作。提取一些字段,然后将其保存在数据库中。我认为它可以节省大量的内存。