Если вы делаете это действительно часто вы можете сделать то вроде этого:
class Model < ActiveRecord::Base
def self.define_with_save(method_name)
define_method "#{method_name}!" do
send method_name
save
end
end
def save # stub method for test purpose
puts 'saving...'
end
def do_stuff
puts 'doing stuff...'
end
define_with_save :do_stuff
end
m = Model.new
m.do_stuff
# => 'doing stuff...'
m.do_stuff!
# => 'doing stuff...'
# => 'saving...'
Если вы хотите, чтобы в нескольких моделях может быть, вы хотели бы создать свой собственный базовый класс для них, содержащих этот define_with_save
класс, или вы можете добавить его в ActiveRecord::Base
, если вы уверены, что вам это нужно.
Кстати, я надеюсь, что вы на самом деле не называете ваши методы в SomeCodeThatDoesSomeCalculations
нотация, поскольку они обычно называются как some_code_that_does_some_calculations
.