Qual é a diferença entre `after_create` e` after_save` e quando usar qual?


124

São after_createe são after_saveiguais às funcionalidades?

Quero fazer uma operação com o email de um usuário após a criação da conta.

Eu quero fazer essa operação quando for salva no banco de dados.

qual é preferível usar: after_createou after_save?

Respostas:


212

after_create só funciona uma vez - logo após a criação do registro.

after_save funciona toda vez que você salva o objeto - mesmo se você o atualizar muitos anos depois

Portanto, se você quiser fazer essa operação de email apenas uma vez (e nunca mais), use after_create.

Se você quiser fazer isso toda vez que o objeto for salvo, faça-o emafter_save


2
os leitores devem observar que, de acordo com os documentos , o ActiveRecord's update_allnão invoca nenhum retorno de chamada, incluindoafter_*
user2426679

93

Dos documentos :

after_create()

É chamado depois Base.saveem novos objetos que ainda não foram salvos (nenhum registro existe).

after_save()

É chamado depois Base.save (independentemente de ser um salvamento de criação ou atualização).


1
after_save()

Funciona bem quando você precisa salvar modelos que não são salvos com muita frequência. Neste exemplo específico de alteração de registros com freqüência, seria aconselhável usar

 after_commit()

certifique-se de que o modelo seja salvo no banco de dados antes que a ação seja executada após a confirmação:

def calculate_credit_score
     #Call a Cron job
end

Você aconselha usar, after_commitmas não explica o porquê. Por favor, você pode elaborar? Observe que after_commité executado em criar, atualizar e destruir. Documentos: apidock.com/rails/ActiveRecord/Transactions/ClassMethods/… Portanto, não é o mesmo comportamento que after_savevocê realmente deseja chamar esse cron_job depois de destruir o registro? Ou, no caso das operações, envie um email para um usuário excluído agora? Tenha cuidado com o usoafter_commit
rmcsharry

after_commité executado nessas operações CRUD; portanto, se o email for atualizado com frequência, será mais fácil combinar a ação para um retorno de chamada específico. No meu caso, eu useiafter_commit : calculate_profile_update, on: :update
pensebien 28/11/19
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.