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

per*_*nce 7 ruby-on-rails

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

user.rb

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

  ...
end
Run Code Online (Sandbox Code Playgroud)

tri*_*anm 13

方案一

您可以创建一个方法,如:

def ok_to_run_test_method?
  street_changed? || something_changed? || something_else_changed?
end
Run Code Online (Sandbox Code Playgroud)

然后使用:

before_save :run_test_method, :if => :ok_to_run_test_method?
Run Code Online (Sandbox Code Playgroud)

注意: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
Run Code Online (Sandbox Code Playgroud)

  • 不确定我是否将块版本称为更现代 - 我喜欢符号形式的可读性(当回调本身不重要时) (3认同)

Chr*_*erg 8

您可以使用以下命令在一行中执行以下操作Proc:

class User
  before_save :run_test_method, :if => Proc.new { |u| u.street_changed? || u.city_changed? || u.state_changed? }

  ...
end
Run Code Online (Sandbox Code Playgroud)