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:
-
.createes equivalente a.newseguido de.save. Es simplemente más sucinto. -
.create!es equivalente a.newseguido de.save!(arroja un error si el guardar falla). También es un poquito más corto - Creo que
.buildes 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