Различия между .build,.create и .create! и когда они должны использоваться?

Итак, я видел людей, использующих .build,.create и .create! в пределах их контроллеров все больше и больше в последнее время. Какая разница от использования только .new и passig объекта param'd, а затем .save? Есть ли плюсы и минусы? Использует ли эти другие методы преимущества?

Ответ 1

Есть несколько отличий, но они не большие:

  • .create эквивалентен .new, за которым следует .save. Это просто более красноречиво.
  • .create! эквивалентен .new, за которым следует .save! (выдает ошибку, если сохранение не выполняется). Это также просто немного короче
  • Я думаю, что .build в основном является псевдонимом для .new. Он работает в Rails 3, а другой - в Rails < 3.x

Однако наиболее важная часть состоит в том, что эти методы можно вызвать через ассоциацию (has_many и т.д.), чтобы автоматически связывать две модели.

Ответ 2

Хотя верно, что create вызывает new, а затем save существует большая разница между двумя альтернативами в их возвращаемых значениях.

save возвращает либо true, либо false в зависимости от того, был ли объект успешно сохранен в базе данных или нет. Это можно затем использовать для управления потоком в соответствии с первым примером в вопросе выше.

create вернет модель независимо от того, был ли объект сохранен или нет. Это имеет значение для кода выше, поскольку верхняя ветвь оператора if всегда будет выполняться, даже если объект не прошел проверку и не сохраняется.

Если вы используете create с логикой ветвления, вы подвергаетесь риску бесшумных сбоев, что не так, если вы используете new + save.

create! не страдает от той же проблемы, что и при возникновении ошибки, и исключение, если запись недействительна.

Альтернатива create может быть полезна в контроллерах, где respond_with используется для ответов API (JSON/XML). В этом случае наличие ошибок в объекте приведет к возврату ошибок в ответе со статусом unprocessable_entity, который именно вы хотите получить от API.

Я бы всегда использовал параметр new + save для html, особенно если вы полагаетесь на возвращаемое значение для управления потоком.

Ответ 3

#create - это более короткая версия нового и сохранить. #Создайте! бросает исключение, если проверка не была положительной.

Ответ 4

Я бы повторил вышеупомянутые ответы. Плюс для create невозможно передать false в качестве аргумента, который вы можете сделать с помощью save. Передача false в качестве аргумента пропустит все проверки валиков