ruby on rails - software - Las diferencias entre.build,.create y.create! y cuando deberían ser usados?
ruby on rails tutorial (4)
¡Así que he estado viendo personas usando .build, .create y .create! dentro de sus controladores cada vez más últimamente. ¿Cuál es la diferencia de simplemente usar .new y pasar el objeto param''d y luego .save? ¿Hay pros y contras? ¿El uso de estos otros métodos ofrece beneficios?
#create es la versión más corta de nuevo y guardar. #¡crear! está lanzando una excepción si la validación no fue positiva.
Aunque es correcto create
llamadas new
y luego save
existe una gran diferencia entre las dos alternativas en sus valores de devolución.
Save
devuelve true
o false
dependiendo de si el objeto se guardó correctamente en la base de datos o no. Esto se puede usar para controlar el flujo según el primer ejemplo en la pregunta anterior.
Create
devolverá el modelo independientemente de si el objeto se guardó o no. Esto tiene implicaciones para el código anterior en el sentido de que la rama superior de la declaración if
siempre se ejecutará incluso si el objeto no supera las validaciones y no se guarda.
Si usa create
con la lógica de bifurcación, corre el riesgo de fallas silenciosas, que no es el caso si usa new
+ save
.
create!
no sufre del mismo problema que plantea y excepción si el registro no es válido.
La alternativa de create
puede ser útil en controladores donde respond_with
se usa para respuestas de API (JSON / XML). En este caso, la existencia de errores en el objeto hará que los errores se devuelvan en la respuesta con un estado de unprocessable_entity
, que es exactamente lo que quiere de una API.
Siempre usaría la new
opción + save
para html, especialmente si está confiando en el valor de retorno para el control de flujo.
Hay un par de diferencias, pero no son grandes:
-
.create
es equivalente a.new
seguido de.save
. Es simplemente más sucinto. -
.create!
es equivalente a.new
seguido de.save!
(arroja un error si el guardar falla). También es un poquito más corto - Creo que
.build
es principalmente un alias para.new
. Funciona de una manera en Rails 3 y de otra manera en Rails <3.x
Sin embargo, la parte más importante es que estos métodos se pueden llamar a través de una asociación ( has_many
, etc.) para vincular automáticamente los dos modelos.
Yo secundaría las respuestas anteriores. Además, para create
, uno no puede pasar false
como un argumento que puede hacer con save
. Pasar false
como argumento omitirá todas las validaciones de rieles