繁体   English   中英

如何在active_record中禁用模型中已更改属性的跟踪

[英]How to disable tracking of changed attributes in model in active_record

我有一个简单的模型,有3个属性idpaylod (二进制数据,大), 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 当然,只有在您不希望保留其他更改时,此方法才有效。

UPDATE

例:

> 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM