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

How to disable tracking of changed attributes in model in active_record

我有一个具有 3 个属性的简单模型 idpaylod(二进制数据,大)、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 哈希中保留先前的值?

您如何看待不同的方法?我的意思是你打电话给 Active Job worker which performs some work by invoking Service Object。最后一个将对您的数据进行操作。提取一些字段,然后将其保存在数据库中。我认为它可以节省很多内存。

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。

如果属性 setter 方法被重载 而没有 调用 super(),所有回调将被禁用并且不会跟踪任何更改。

def payload= ( new_payload )
  @payload = new_payload
end

在这个使用只读模型的用例中,它工作正常。请注意,该模型也未标记为脏,并且 可能会出现其他副作用