Когда использовать `save` vs` save! `В модели?
Согласно сохранить удары головой, активная запись приведет вас в бешенство, нам следует избегать использования save!
и rescue
идиомы для исключительных ситуации. Учитывая, что для модели требуется @post.mark_rejected
.
Если код в mark_rejected
не удается выполнить из-за одной из нижеперечисленных проблем, следует ли исключить исключение?
- если есть проблема проверки
- если для поля, отличного от nullable, присваивается значение null
- если в базе данных была потеря связи
Если мы не генерируем исключение, то:
- Действия контроллера должны проверять значение возврата
mark_rejected
и делать это.
- мы не ожидаем исключения из этого вызова метода, поэтому мы не пишем предложение
rescue
в действии контроллера, поэтому исключение пузырится до (где угодно) и, вероятно, будет отображаться как часть ( 500 HTTP?)
Пример кода:
def mark_rejected
...
save!
end
или
def mark_rejected
...
save
end
Ответы
Ответ 1
В исключении больше накладных расходов, поэтому возникает проблема с производительностью, особенно когда можно ожидать, что она, скорее всего, будет выбрана часто, как в случае с save
.
Менее строк кода проверяет, является ли возвращаемое значение ложным, чем аварийное исключение, поэтому я не вижу, как это проблема, связанная с проверкой возвращаемого значения, если вам уже нужно спасти исключение. Как часто исключение, создаваемое save!
, когда-либо должно было набирать стек вызовов на практике? Редко, если когда-либо, по моему опыту.
Если при вызове save
существует исключение, а не save!
, вам нужно, чтобы он показывал страницу с ошибкой 500, потому что произошло то, что произошло: ошибка, которая не была восстановлена, неизвестна и неожиданна.
Ответ 2
save!
приведет к ошибке, если не удастся.
save
вернет true или false.