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?

Swapnil Chincholkar
fonte

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

Taryn East
fonte
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).

Michael Kohl
fonte
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
pensebien
fonte
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