I would like to create a before_save
callback that only gets run if there have been changes to any (but not necessarily all) of the three fields (street, city,
Option One
You could create a method like:
def ok_to_run_test_method?
street_changed? || something_changed? || something_else_changed?
end
and then use:
before_save :run_test_method, :if => :ok_to_run_test_method?
Note how :ok_to_run_test_method?
is a symbol. Not sure if it was a typo or not but in your question you are actually calling a class method street_changed?
.
Option Two
Modernise your callbacks a little bit and use the block-style syntax:
before_save do
if street_changed? || something_changed? || something_else_changed?
# whatever you currently have in #run_test_method
end
end
You can do it in one line using a Proc
:
class User
before_save :run_test_method, :if => Proc.new { |u| u.street_changed? || u.city_changed? || u.state_changed? }
...
end
You can also use a lambda
:
before_save :run_test_method, if: ->(u) {u.street_changed? || u.something_changed? || u.something_else_changed?}