Когда использовать "сохранить" против " сохранить! в модель?
по данным сохранить удар головой, активная запись сведет вас с ума, мы должны избегать использования 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!
в противном случае.идея: если метод возвращает результат сохранения, вы не должны выбрасывать исключение и позволять вызывающему объекту обрабатывать проблемы сохранения, но если сохранение скрыто внутри логики метода модели, вы хотите прервать процесс с исключением в случае сбоя.