保存后何时更新记录?

时间:2011-10-19 16:23:32

标签: ruby-on-rails paperclip

我正在使用paperclip将文件附加到我的模型中。我想要做的是,在保存模型并将文件写入磁盘后,我需要更新模型中关于文件的另一个属性(CRC)。由于回形针在调用.save之后才将文件写入磁盘,我首先想到的是使用after_save回调。当我这样做时,我得到一个“SystemStackError(堆栈级别太深):”错误。然后我尝试做一个after_commit回调,看起来效果好一点。例如,如果我只是给我的crc分配:

self.crc = "TEST"
self.save

这很有效。但是,如果我尝试做我的真实作业,请使用:

self.crc = "0x" + IO.read(self.patchfile.path, 4, 0x20).unpack("H8").join
self.save

WEBrick中止:

/usr/local/rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(+0x180048) [0x290048]
/usr/local/rvm/rubies/ruby-1.9.2-p290/lib/libruby.so.1.9(rb_yield+0x56) [0x294c46]

[NOTE]
You may have encountered a bug in the Ruby interpreter or extension libraries.
Bug reports are welcome.
For details: http://www.ruby-lang.org/bugreport.html

Aborted

所以我在想我做错了......

1 个答案:

答案 0 :(得分:5)

您正在进行after_save回调,而您正在呼叫save。这将再次触发你的回调,这是你的无限循环“堆栈级太深”的错误来自。

考虑使用您在回调中排队的DelayedJob。让后台任务处理分配CRC的工作。但是,您仍然会发生无限循环,但这次是无限循环的排队作业。

请查看:How can I avoid running ActiveRecord callbacks?,了解在特定条件下跳过回调的提示。

编辑:

您可能还想编写自己的Paperclip后期处理器。请阅读自述文件中的“后处理”和“自定义附件处理器”部分,并深入了解代码以了解现有处理器的运行方式。

https://github.com/thoughtbot/paperclip