Devolución de llamada de Ruby on Rails, ¿cuál es la diferencia entre: before_save y: before_create?

184

Podría explicar en detalle lo que el :before_savey :before_createRuby on Rails devoluciones de llamada son, y lo que tienen que ver con las validaciones Rails? ¿La validación ocurre después :before_saveo :before_create?

Agung Prasetyo
fuente

Respuestas:

363

En una operación de creación en Rails, hay seis devoluciones de llamada antes de la operación de la base de datos, y dos después. En orden, estos son:

  1. before_validation
  2. before_validation_on_create
  3. after_validation
  4. after_validation_on_create
  5. before_save
  6. before_create

    INSERCIÓN DE BASE DE DATOS
  7. after_create
  8. after_save

Las operaciones de actualización tienen exactamente el mismo conjunto, excepto leer en updatelugar de en createtodas partes (y ACTUALIZAR en lugar de INSERTAR ).

A partir de esto, puede ver que la validación se realiza antes de las devoluciones de llamada before_savey before_create.

El before_saveocurre un poco antes del before_create. Que yo sepa, no pasa nada entre ellos; pero before_savetambién se activará en las operaciones de Actualización, mientras before_createque solo se activará en Creates.

Chowlett
fuente
27
before_validation_on_createy after_validation_on_createse eliminan a partir de Rails 3 , en su lugar use before_validationy after_validationrespectivamente con la opción :on => :create.
Dom
¿Cómo se referiría al registro que se acaba de crear al usar after_saveo after_create?
bcackerman
@bcackerman: en la devolución de llamada after_saveo after_create, selfes el registro que se acaba de guardar, tal como existe después de guardar. Que incluye campos como autogenerados id, created_at, updated_at.
Chowlett
Recuerde también se before_createrefiere a un nuevo objeto que se guarda en la base de datos, no al createmétodo real al que se llama. Por lo tanto, before_createtodavía se puede disparar incluso desde el savemétodo.
Steve
1
@Rads - er, ¿no? Los documentos todavía enumeran before_save3ro y before_create5to.
Chowlett
136

before_savese llama cada vez que se guarda un objeto. Entonces para objetos nuevos y existentes. (crear y actualizar acción)

before_createsolo antes de la creación. Tan solo para objetos nuevos (crear acción)

Michael Koper
fuente