before_destroy

6 views
Skip to first unread message

Ivan

unread,
Nov 11, 2009, 10:52:18 AM11/11/09
to rails-br
Pessoas.

Eu preciso consistir a existência de registros "filhos" para poder
efetuar uma exclusão. Se houver "filhos", não posso excluir.
Para isto utilizei o callback "before_destroy", da seguinte forma.

before_destroy :tem_filhos?

Pela documentação, se ":tem_filhos?" retornar "false" o "destroy"
deveria ser abortado e um rollback deveria ser disparado.
Infelizmente não é o que está acontecendo. Cheguei a forçar o retorno
do false (como situação única) e, mesmo assim, o "destroy" no registro
"pai" é executado.

Estou fazendo correto?
Como fazer para evitar que um registro "pai" seja excluído se houver
"filhos"?

Abs,

Ivan

G. Sobrinho

unread,
Nov 11, 2009, 11:00:03 AM11/11/09
to rail...@googlegroups.com
http://github.com/scambra/dependent_protect ;)

2009/11/11 Ivan <ihsch...@gmail.com>



--
Cordialmente,

Gabriel Sobrinho
Diretor de desenvolvimento

Hite - Comunicação Digital e Mídia Interativa
http://www.hite.com.br/

+55 31 8775 8378

Ivan Schuster

unread,
Nov 11, 2009, 11:23:27 AM11/11/09
to rail...@googlegroups.com
Obrigado Sobrinho, mas e quanto ao que estou fazendo, está errado ou não está funcionando como deveria?
Saberias me dizer?

Abs,

Ivan

2009/11/11 G. Sobrinho <gabriel....@gmail.com>

wurtog

unread,
Nov 11, 2009, 11:48:05 AM11/11/09
to rail...@googlegroups.com
Ivan,

No seu modelo você deve fazer um overload do método before_destroy
(isto é, criar um método chamado before_destroy) dentro do seu modelo.
Se esse método retornar falso, aí sim, a ação é cancelada.

Abraços!

2009/11/11 Ivan <ihsch...@gmail.com>:
--
wurtog
http://twitter.com/wurtog

Ivan Schuster

unread,
Nov 12, 2009, 6:17:59 PM11/12/09
to rail...@googlegroups.com
Minhas conclusões:

1) Tanto a utilização do callback "before_destroy", quanto fazer um overload do método "before_destroy", funcionam. Isto é, retornando "false" o "destroy" é abortado.

2) Onde, então, está o problema? Se na declaração do "has_many" for utilizada a opçao ":dependent => destroy" em relação ao filho - o que, convenhamos, não faz sentido, pois é justamente o que se quer evitar ;-) - os registros do filho serão excluídos antes da validação. Isto é, o "dependent => :destroy" é executado antes do "before_save". Aí, quando o "before_save" é executado, não há mais registros filhos, pois já foram excluídos.

3) Mas e se eu quiser usar o ":dependent : => destroy" junto com o "before_destroy", tem como? Tem. Simplesmente declare o "before_destroy" ANTES do "has_many". Como está bem descrito na documentação, o Rails executa os callbacks na ordem em que aparecem.

Obrigado à todos.

Abs,

Ivan

2009/11/11 wurtog <wur...@gmail.com>
Reply all
Reply to author
Forward
0 new messages