O Rails esta lento? Reveja seu código…

Carlos Brando
Nome do Jogo
Published in
1 min readSep 27, 2007

No Ruby on Rails podemos especificar que ao apagar um registro no banco de dados todos os relacionamentos dependentes dele também sejam apagados. No exemplo abaixo temos um objeto Customer (cliente) que possui muitos pedidos (orders) e ao apagar um cliente desejamos que todos os seus pedidos também sejam apagados automaticamente.

class Customer < ActiveRecord::Base 
has_many :orders, dependent: :destroy
end

Porém, é importante ficar atento a um efeito colateral existente no código acima: ao apagar o registro do cliente, cada pedido será apagado individualmente no banco de dados. Se o cliente possuir muitos pedidos, cada um deles será responsável pela execução de um comando DELETE no banco de dados.

Em alguns casos será importante usar a forma acima, principalmente se houver callbacks que só seriam executados ao apagar cada um dos pedidos de forma individual. Porém, se não for necessário disparar callbacks, você pode alterar o código para essa versão mais performática:

class Customer < ActiveRecord::Base 
has_many :orders, dependent: :delete_all
end

O código acima faz exatamente a mesma coisa que o anterior, porém ele apaga os registros diretamente no banco de dados com apenas uma única instrução.

É importante ficar atento a esses recursos do Ruby on Rails. Em alguns casos você pode ter um ganho de performance significativo com uma alteração simples.

Originally published at nomedojogo.com on September 27, 2007.

--

--

Carlos Brando
Nome do Jogo

Programmer, CTO at @enjoei, Author of two books about Ruby on Rails, and Host of the @grokpodcast.