Ruby on Rails Callback, qual é a diferença entre: before_save e: before_create?


184

Você poderia explicar em detalhes o que o :before_savee :before_createRuby on Rails retornos de chamada são, eo que eles têm a ver com Rails validações? A validação ocorre após :before_saveou :before_create?

Respostas:


363

Em uma operação de criação no Rails, há seis retornos de chamada antes da operação do banco de dados e dois depois. Em ordem, são eles:

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

    INSERT DATABASE
  7. after_create
  8. after_save

As operações de atualização têm exatamente o mesmo conjunto, exceto a leitura em updatevez de em createqualquer lugar (e UPDATE em vez de INSERT ).

A partir disso, é possível ver que a validação é realizada antes dos retornos de chamada before_savee before_create.

O before_saveocorre um pouco antes do before_create. Que eu saiba, nada acontece entre eles; mas before_savetambém será acionado nas operações de atualização, enquanto before_createserá acionado apenas no Cria.


27
before_validation_on_createe after_validation_on_createsão removidos a partir de trilhos 3 , em vez disso usar before_validatione after_validation, respectivamente, com a opção :on => :create.
Sun

Como você se referiria ao registro que acabou de ser criado ao usar after_saveou after_create?
bcackerman

@bcackerman - no retorno de chamada after_saveou after_create, selfé o registro que acabou de ser salvo, pois existe após o salvamento. Que os campos inclui Autogenerated gosto id, created_at, updated_at.
Chowlett

Lembre- before_createse também de que um novo objeto está sendo salvo no banco de dados, e não o createmétodo real que está sendo chamado. Assim, before_createainda pode ser acionado, mesmo a partir do savemétodo.
Steve

1
@Rads - er, não? Os documentos ainda listam before_save3 e before_create5.
Chowlett

136

before_saveé chamado toda vez que um objeto é salvo. Assim, para objetos novos e existentes. (criar e atualizar ação)

before_createsomente antes da criação. Portanto, apenas para novos objetos (criar ação)


Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.