Neste artigo, mostrarei por que você precisa usar o db_belongs_to
da db_belongs_to
database_validations em vez do usual usual.
Tenho certeza de que a maioria de vocês está familiarizada com belongs_to
do ORM ActiveRecord . Mas você sabia que a inicialização de uma conexão usando belongs_to
em seu modelo também adiciona validação à existência de uma conexão. Isso ocorre porque belongs_to
possui a optional: false
por padrão.
Assim, toda vez que você salva um novo objeto ou atualiza um existente, você executa uma consulta SQL SELECT adicional para cada um de seus links.
Exemplo
class User < ActiveRecord::Base belongs_to :company belongs_to :country end user = User.first user.update(some_field: 'something')
Você também deve estar ciente de que essa abordagem não garante a integridade do banco de dados, pois os links podem ser excluídos posteriormente (em solicitações subsequentes ou paralelas) sem problemas.
user.update(...) user.company.destroy! => , , , ( )
Para resolver esse problema, você pode adicionar a restrição de chave estrangeira correspondente ao seu banco de dados. Tendo essa limitação, você sempre terá certeza de que essa conexão existe.
E o desempenho? Por que precisamos fazer consultas SELECT no banco de dados se já temos certeza de que a integridade dos dados será mantida (usando a restrição de chave estrangeira)?
A resposta é simples - não há necessidade. Mas, para tornar isso possível, precisamos resolver o problema de lidar com a exceção ActiveRecord::InvalidForeignKey
, ActiveRecord::InvalidForeignKey
quando tentamos salvar a conexão que não está no banco de dados. Isso é necessário para se ter o mesmo comportamento que com belongs_to
, para que os errors
incluam os mesmos erros.
Para não escrever todo o processamento, a gema database_validations será útil. Essa gema já inclui validates_db_uniqueness_of
, que as pessoas gostaram (uma postagem no hub ) e agora possui db_belongs_to
, o que é muito fácil de implementar em seu projeto. db_belongs_to
melhora o desempenho e garante a integridade dos dados.
O método faz algumas coisas para você:
- Verifica a existência da restrição de chave estrangeira correta no banco de dados durante a inicialização do aplicativo;
- Analisa exceções do banco de dados e fornece erros apropriados para os
errors
seu objeto; - Elimina a necessidade de executar consultas SQL extras no banco de dados;
Eu recomendo que você use database_validations em seus projetos. Esta jóia já foi testada no ambiente de produção e provou ser muito boa. Apesar da facilidade de implementação, ele pode melhorar bastante o desempenho do seu projeto, pois quanto mais você o usa, mais economiza ; confira os benchmarks do grupo para obter detalhes.
Qualquer feedback é bem-vindo! Somos gratos por qualquer contribuição ao projeto!