首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >如何在after_save中更新属性,而不会在rails 2.3中导致递归?

如何在after_save中更新属性,而不会在rails 2.3中导致递归?
EN

Stack Overflow用户
提问于 2011-07-13 23:20:43
回答 5查看 15.7K关注 0票数 15

我有一个模型,它有一个Paperclip附加的视频。保存后,我使用保存的视频生成缩略图。我需要在每次保存后执行此操作,即使新视频尚未上传,因为用户可以更改捕获缩略图的时间。

我目前正在使用after_post_process来做这件事,但它只会在上传文件时生成缩略图(这是一个回调,是回调的一部分)。

理想情况下,我会使用如下所示的after_save回调:

代码语言:javascript
运行
复制
after_save :save_thumbnail
def save_thumbnail
  #generate thumbnail...
  self.update_attributes(
    :thumbnail_file_name => File.basename(thumb), 
    :thumbnail_content_type => 'image/jpeg'
  )
end

不幸的是,update_attributes调用了before_save,然后调用了导致无限循环的save回调。有没有一种简单的方法来规避这种行为?

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-07-13 23:23:19

您可以将其封装在一个条件中,如下所示:

代码语言:javascript
运行
复制
def save_thumbnail
  if File.basename(thumb) != thumbnail_file_name
    self.update_attributes(
      :thumbnail_file_name => File.basename(thumb), 
      :thumbnail_content_type => 'image/jpeg'
    )
  end
end

这样它就只会运行一次。

票数 9
EN

Stack Overflow用户

发布于 2014-02-28 18:22:28

在Rails3+中,after_save回调中的任何update_attribute都会导致递归。应该做的是:

代码语言:javascript
运行
复制
after_save :updater!
# Awesome Ruby code
# ...
# ...

private

  def updater!
    self.update_column(:column_name, new_value) # This will skip validation gracefully.
  end

这里有一些关于它的文档:https://guides.rubyonrails.org/active_record_callbacks.html#skipping-callbacks

票数 12
EN

Stack Overflow用户

发布于 2011-07-13 23:30:35

Rails 2:

代码语言:javascript
运行
复制
Model.send(:create_without_callbacks)
Model.send(:update_without_callbacks)

Rails 3:

代码语言:javascript
运行
复制
Vote.skip_callback(:save, :after, :add_points_to_user)

请参阅此问题:

How to skip ActiveRecord callbacks?

票数 8
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/6681285

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档