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

时间:2015-11-11 17:44:28

标签: ruby-on-rails ruby-on-rails-4 activerecord rails-activerecord jrubyonrails

我有一个简单的模型,包含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哈希值中的先前值的模型?

3 个答案:

答案 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来完成一些工作。最后这个将对您的数据进行操作。提取一些字段,然后将其保存在数据库中。我认为它可以节省大量的内存。