Когда использовать `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.