Когда использовать "сохранить" против " сохранить! в модель?
по данным сохранить удар головой, активная запись сведет вас с ума, мы должны избегать использования save! и rescue идиома для исключительных ситуаций. Учитывая это, скажем, модель должна @post.mark_rejected.
если код mark_rejected сбой из-за одной из приведенных ниже проблем, должно ли быть выдано исключение? :
- если есть проблема проверки
- если nullable-полю присваивалось значение null
- если бы был потеря соединения с базой данных
если мы не выбрасываем исключение, то:
- действие контроллера должно было бы проверить возвращаемое значение
mark_rejectedи сделать это вещь - мы не ожидаем исключения из этого вызова метода, поэтому мы не пишем
rescueпредложение в действии контроллера, таким образом, исключение пузырится до (..Где бы..) и, вероятно, появится как некоторые (500 HTTP?) ошибка
пример код:
def mark_rejected
...
save!
end
или
def mark_rejected
...
save
end
3 ответа:
в исключении больше накладных расходов, поэтому есть проблема с производительностью, особенно когда можно ожидать, что он, вероятно, будет часто выбрасываться, как в случае с
save.Это меньше строк кода, чтобы проверить, если возвращаемое значение является ложным, чем спасти исключение, поэтому я не вижу, как это проблема, чтобы проверить возвращаемое значение, если вы уже должны спасти исключение. Как часто исключение, брошенное
save!когда-нибудь придется пузыриться стек вызовов в практика? Редко, если вообще когда-либо, по моему опыту.если возникает исключение при вызове
saveв противоположностьsave!вы должны хотеть, чтобы он показывал страницу ошибки 500, потому что это то, что произошло: неустранимая, неизвестная, неожиданная внутренняя ошибка сервера.
предложение: использовать
saveкогда он находится на последней строке;save!в противном случае.идея: если метод возвращает результат сохранения, вы не должны выбрасывать исключение и позволять вызывающему объекту обрабатывать проблемы сохранения, но если сохранение скрыто внутри логики метода модели, вы хотите прервать процесс с исключением в случае сбоя.