Rails:如何只为一个已更改的属性运行before_update?

时间:2012-12-29 05:36:24

标签: ruby-on-rails ruby-on-rails-3 activerecord beforeupdate

在我的模型Shop中,我将图片网址保存在logo_ori中并使用该图片使用before_update制作缩略图。

# shop.rb
before_update :run_blitline_job

private

def run_blitline_job
  # uses logo_ori to make thumbnails
end

但是我发现当我保存其他属性时(例如:在表单中编辑商店的个人资料),它也会运行before_update。仅在保存logo_ori时如何限制其执行?

我试过这个:

before_update :run_blitline_job, :if => :logo_ori?

但如果我之前已经保存before_update,它仍会运行logo_ori

3 个答案:

答案 0 :(得分:31)

before_update :run_blitline_job, :if => :logo_ori_changed?

每次logo_ori属性更改时,都会运行回调。您还可以使用字符串来实现多个条件:

before_update :run_blitline_job, :if => proc { !logo_ori_was && logo_ori_changed? }

答案 1 :(得分:3)

你很亲密,你想要这样的东西:

before_update { |shop| shop.run_blitline_job if shop.logo_ori_changed? }

来源:

http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html

http://api.rubyonrails.org/classes/ActiveModel/Dirty.html

答案 2 :(得分:0)

它很简单,您可以使用ActiveModel::Dirty(查看文档),它可用于rails 3中的所有型号

before_update { |shop| shop.run_blitline_job if shop.logo_ori_changed? }