O #new_record? função determina se um registro foi salvo. Mas é sempre falso no after_save
gancho. Existe uma maneira de determinar se o registro é um registro recém-criado ou antigo da atualização?
Espero não usar outro retorno de chamada, como before_create
definir um sinalizador no modelo ou exigir outra consulta no banco de dados.
Qualquer conselho é apreciado.
Editar: preciso determiná-lo no after_save
gancho e, para meu caso de uso específico, não há nenhum carimbo de data updated_at
/ updated_on
hora
ruby-on-rails
activerecord
activemodel
Aaron Qian
fonte
fonte
Respostas:
Eu estava tentando usar isso para um
after_save
retorno de chamada.Uma solução mais simples é usar
id_changed?
(uma vez que não mudaupdate
) ou mesmocreated_at_changed?
se as colunas de carimbo de data / hora estiverem presentes.Atualizar: como @mitsy aponta, se esta verificação for necessária fora dos retornos de chamada, use
id_previously_changed?
. Veja a documentação .fonte
after_save
.id_changed?
será falso depois que o registro for salvo (fora dos ganchos, pelo menos). Nesse caso, você pode usarid_previously_changed?
Não há mágica de trilhos aqui que eu conheça, você terá que fazer isso sozinho. Você pode limpar isso usando um atributo virtual ...
Em sua classe de modelo:
fonte
Outra opção, para aqueles que fazem tem um
updated_at
carimbo do tempo:fonte
created_at
igualarupdated_at
em umafter_save
retorno de chamada a qualquer momento diferente de quando ele é criado pela primeira vez?"created_at
eupdated_at
será igual em umafter_save
retorno de chamada. Em todas as outras situações, eles não serão iguais noafter_save
retorno de chamada.Existe um
after_create
callback que só é acionado se o registro for um novo registro, após ser salvo . Também há umafter_update
retorno de chamada para uso se este for um registro existente que foi alterado e salvo. Oafter_save
retorno de chamada é chamado em ambos os casos, apósafter_create
ouafter_update
é chamado.Usar
after_create
se precisar que algo aconteça uma vez depois que um novo registro for salvo.Mais informações aqui: http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html
fonte
Uma vez que o objeto já foi salvo, você precisa verificar as alterações anteriores. O ID só deve mudar após a criação.
Também existe uma variável de instância
@new_record_before_save
. Você pode acessá-lo fazendo o seguinte:Ambos são muito feios, mas permitem que você saiba se o objeto foi criado recentemente. Espero que ajude!
fonte
after_save
retorno de chamada usando Rails 4 e nenhum deles está trabalhando para identificar este novo registro.@object.previous_changes[:id].any?
é bastante simples e elegante. Funciona para mim depois que o registro é atualizado (não chamo deafter_save
).@object.id_previously_changed?
é um pouco menos feio.after_save
Rails 4 que você gostaria de olhar aochanges[:id]
invés deprevious_changes[:id]
. No entanto, isso está mudando no Rails5.1 (veja a discussão em github.com/rails/rails/pull/25337 )previous_changes.key?(:id)
para um melhor entendimento.Via Rails 5.1+:
fonte
Para Rails 4 (verificado em 4.2.11.1), os resultados de
changes
e osprevious_changes
métodos são hashes vazios{}
na criação de objetos internosafter_save
. Portanto,attribute_changed?
métodos comoid_changed?
não funcionarão conforme o esperado.Mas você pode aproveitar este conhecimento e - sabendo que pelo menos 1 atributo deve estar em
changes
atualização - verifique sechanges
está vazio. Depois de confirmar que está vazio, você deve estar durante a criação do objeto:fonte
Gosto de ser específico mesmo sabendo que
:id
não deve mudar no normal, masÉ sempre mais barato ser específico em vez de encontrar um bug inesperado muito estranho.
Da mesma forma, se eu esperar
true
sinalização de argumento não confiávelIsso economiza muitas horas para não ficar sentado em cima de insetos estranhos.
fonte