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





#create - это более короткая версия new и save. #Создайте! выдает исключение, если проверка не была положительной.
Есть пара отличий, но они не большие:
.create эквивалентен .new, за которым следует .save. Это просто более лаконично..create! эквивалентен .new, за которым следует .save! (выдает ошибку, если сохранение не удается). Это также немного короче.build - это по большей части, псевдоним для .new. Это работает в одну сторону в Rails 3 и другой способ в Rails <3.xОднако наиболее важной частью является то, что эти методы можно вызывать через ассоциацию (has_many и т. д.) Для автоматического связывания двух моделей.
Небольшое уточнение по 3 - build делает немного больше, чем просто новое - он также устанавливает ссылку ассоциации.
Как вы звоните через ассоциацию в отношениях «Многих-Многих»?
Сборка отличается от Новой. Но разница не в том, что он устанавливает ссылку ассоциации (New делает это и для нового экземпляра). Разница в том, что Build заполняет вызывающий объект новым экземпляром, а New - нет. Так, например: Wall.posts.new дает вам новый пост, связанный с вашей стеной, но Wall.posts все еще остается пустым после этого вызова. Wall.posts.build дает вам новый пост, связанный с вашей стеной, и в вашем Wall.posts теперь есть одно сообщение.
Разве это не просто псевдоним, без особой функциональности?
В Rails 4 я только что проверил консоль. Wall.posts.new и wall.posts.build заполняют объект стены одинаково. Значит, после wall.posts.new wall.posts не пуст, как утверждается в комментарии Амина.
@AminAriana Тогда в чем разница между .build и .create? Согласно документации, .save также создаст новую запись в базе данных (вызывающий абонент с новым экземпляром?). Документы на .save: "If the model is new a record gets created in the database, otherwise the existing record gets updated"
Я бы поддержал приведенные выше ответы. Кроме того, для create нельзя передавать false в качестве аргумента, что можно сделать с save. Передача false в качестве аргумента пропустит все проверки рельсов
Хотя правильно, что create вызывает new, а затем save, между двумя альтернативами существует большая разница в их возвращаемых значениях.
Save возвращает либо true, либо false в зависимости от того, был ли объект успешно сохранен в базе данных или нет. Затем это можно использовать для управления потоком, как в первом примере в вопросе выше.
Create вернет модель независимо от того, был ли объект сохранен или нет. Это имеет последствия для приведенного выше кода в том смысле, что верхняя ветвь оператора if всегда будет выполняться, даже если объект не прошел проверку и не был сохранен.
Если вы используете create с логикой ветвления, вы подвержены риску тихих сбоев, чего не происходит, если вы используете new + save.
create! не страдает той же проблемой, что и вызывает исключение, если запись недействительна.
Альтернатива create может быть полезна в контроллерах, где respond_with используется для ответов API (JSON / XML). В этом случае наличие ошибок в объекте приведет к тому, что ошибки будут возвращены в ответе со статусом unprocessable_entity, что именно то, что вы хотите от API.
Я бы всегда использовал опцию new + save для html, особенно если вы полагаетесь на возвращаемое значение для управления потоком.
Я выбрал этот как наиболее правильный ответ из-за упоминания возможности связать с ними связанные модели - это интересное и важное отличие, которое я думаю об использовании .new и .save. Что требует дополнительной работы. Спасибо.