Когда использовать "сохранить" против " сохранить! в модель?


по данным сохранить удар головой, активная запись сведет вас с ума, мы должны избегать использования 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 52

3 ответа:

в исключении больше накладных расходов, поэтому есть проблема с производительностью, особенно когда можно ожидать, что он, вероятно, будет часто выбрасываться, как в случае с save.

Это меньше строк кода, чтобы проверить, если возвращаемое значение является ложным, чем спасти исключение, поэтому я не вижу, как это проблема, чтобы проверить возвращаемое значение, если вы уже должны спасти исключение. Как часто исключение, брошенное save! когда-нибудь придется пузыриться стек вызовов в практика? Редко, если вообще когда-либо, по моему опыту.

если возникает исключение при вызове save в противоположность save! вы должны хотеть, чтобы он показывал страницу ошибки 500, потому что это то, что произошло: неустранимая, неизвестная, неожиданная внутренняя ошибка сервера.

save! вызовет ошибку, если не удастся.

save вернет логическое значение типа true или false.

предложение: использовать save когда он находится на последней строке;save! в противном случае.

идея: если метод возвращает результат сохранения, вы не должны выбрасывать исключение и позволять вызывающему объекту обрабатывать проблемы сохранения, но если сохранение скрыто внутри логики метода модели, вы хотите прервать процесс с исключением в случае сбоя.