[英]Correct way to add virtual attributes to a rails active_record model
[英]How to disable tracking of changed attributes in model in active_record
我有一个简单的模型,有3个属性id
, paylod
(二进制数据,大), created_at
。
我需要从有效负载数据中提取一堆值,以便进一步处理我在after_initialize
回调方法中执行的操作。 由于有效负载可能非常大(约20MB),我想在提取必要信息后设置@payload = nil
来处理这些数据,以防止在加载一堆条目时出现内存不足的情况。 注意:该模型仅从DB读取,无需保留任何更改。
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
哈希中保留先前值的模型?
将payload
设置为nil后调用clear_changes_information
。 当然,只有在您不希望保留其他更改时,此方法才有效。
例:
> 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。
如果在不调用super()
情况下重载属性setter方法,则会禁用所有回调并且不会跟踪任何更改。
def payload= ( new_payload )
@payload = new_payload
end
在这个只读模型的用例中,这很好用。 请注意,该模型也没有标记为脏,并且可能会出现其他副作用 。
您如何看待不同的方法? 我的意思是你调用一个Active Job worker,它通过调用Service Object来执行一些工作。 最后这个将对您的数据进行操作。 提取一些字段,然后将其保存在数据库中。 我认为它可以节省大量内存。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.