Различия между .build, .create и .create! и когда они должны быть использованы? - PullRequest
163 голосов
/ 31 декабря 2008

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

Ответы [ 4 ]

225 голосов
/ 31 декабря 2008

Есть пара отличий, но они невелики:

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

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

32 голосов
/ 08 марта 2013

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

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

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

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

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

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

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

6 голосов
/ 31 декабря 2008

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

5 голосов
/ 05 апреля 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...