Ни. Если это значительная часть логики, почему бы не включить ее в отдельный класс?
В качестве альтернативы, если ваши (я предполагаю) данные формы можно настроить следующим образом:
params[:models] = { id_of_instance_1 => { :attribute => value },
id_of_instance_2 => { :attribute => value2 },
}
Вы можете довольно легко выполнить групповое обновление на вашем контроллере с помощью:
Model.update(params[:models].keys, params[:models].values)
Может помочь дополнительная информация о деталях, которые вы обновляете и откуда они берутся.
РЕДАКТИРОВАТЬ: После прочтения вашего ответа ниже ...
Есть несколько способов сделать это. Вы можете реализовать Model.win
и Model.lose
как методы класса для включения логики, а затем просто вызвать эти методы из вашего контроллера:
def process_outcome
@winner = Model.win(params[:winning_id])
@loser = Model.lose(params[:losing_id])
end
Или даже как единственный вызов метода:
def process_outcome
# passing the entire params hash to `process_outcome` which returns an array
@winner, @loser = Model.process_outcome(params)
end
Лично, если бы все вовлеченные дочерние объекты были экземплярами одной модели, я бы реализовал эту логику в самом классе.
Однако, если вы добавляете в класс различные классы, возможно, стоит объединить их в отдельный объект:
# app/controllers/models_controller.rb
def process_outcome
@outcome_processor = OutcomeProcessor.new(params)
@winner = @outcome_processor.winner
@loser = @outcome_processor.loser
end
В любом случае, ваш фактический блок транзакции должен не находиться в контроллере.