Итак, я видел людей, использующих .build,.create и .create! в пределах их контроллеров все больше и больше в последнее время. Какая разница от использования только .new и passig объекта param'd, а затем .save? Есть ли плюсы и минусы? Использует ли эти другие методы преимущества?
Различия между .build,.create и .create! и когда они должны использоваться?
Ответ 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
в качестве аргумента пропустит все проверки валиков