如何使用Ruby on Rails中多个已更改字段的if语句创建回调?

时间:2012-10-15 03:15:24

标签: ruby-on-rails

我想创建一个before_save回调,只有在三个字段(街道,城市,州)的任何(但不一定是全部)更改时才会运行。你怎么做到这一点?感谢

user.rb

class User
  before_save :run_test_method, :if => street_changed?

  ...
end

3 个答案:

答案 0 :(得分:10)

选项一

您可以创建一个方法:

def ok_to_run_test_method?
  street_changed? || something_changed? || something_else_changed?
end

然后使用:

before_save :run_test_method, :if => :ok_to_run_test_method?

请注意:ok_to_run_test_method?是一个符号。不确定是否是拼写错误,但在您的问题中,您实际上是在调用方法street_changed?

选项二

稍微现代化你的回调并使用块式语法:

before_save do
  if street_changed? || something_changed? || something_else_changed?
    # whatever you currently have in #run_test_method
  end
end

答案 1 :(得分:8)

您可以使用Proc

在一行中执行此操作
class User
  before_save :run_test_method, :if => Proc.new { |u| u.street_changed? || u.city_changed? || u.state_changed? }

  ...
end

答案 2 :(得分:0)

您还可以使用lambda

before_save :run_test_method, if: ->(u) {u.street_changed? || u.something_changed? || u.something_else_changed?}