Depois de algum tempo desde o início do desenvolvimento do seu projeto, você pode perceber que há inconsistências entre as restrições no banco de dados e as validações no aplicativo. Neste artigo, explico como o gem
database_consistency ajudará você a arrumar seu banco de dados.
Discutimos duas situações possíveis. Código de exemplo gravado para
ActiveRecord .
Primeira situação
Suponha que você tenha uma tabela que é apresentada da seguinte maneira:
create_table :users do |t| t.string :name end
e uma classe declarada como:
class User < ApplicationRecord validates :name, presence: true end
Nesse caso, a validação pode ser ignorada usando métodos como:
save(validate: false)
e, como resultado, um valor
NULL será armazenado no banco de dados. Na
maioria dos casos, você não gostaria que isso acontecesse (porque você instalou a validação). Portanto, seria mais correto ter uma restrição diferente de zero no banco de dados.
create_table :users do |t| t.string :name, null: false end
Segunda situação (reversa)
Suponha que você tenha uma tabela que é apresentada da seguinte maneira:
create_table :users do |t| t.string :name, null: false end
e uma classe declarada como:
class User < ApplicationRecord validates :name end
Nesse caso,
valid?
retornará
true
para registros que não podem ser salvos. Além disso, uma tentativa de salvar esse registro no banco de dados será executada de uma a várias consultas SQL e, finalmente, retornará um erro, ao reverter toda a transação. Todas essas manipulações são ineficientes e podem ser facilmente resolvidas adicionando
presence: true
validação. Na maioria dos casos, você deve adicionar essa validação.
A questão surgiu diante de mim: como encontrar todos esses casos automaticamente?
Apresento a você minha gema
database_consistency . No momento, ele detecta a maioria dos casos. Como um pequeno bônus, ele também lhe dirá uma situação em que é possível salvar um registro com um valor
NULL em uma coluna com uma restrição diferente de zero.
Algumas perguntas permanecem em aberto:
- Que outras oportunidades para implementar?
- Existe a necessidade de oferecer suporte a outros ORMs como sequela ?
Experimente você mesmo e compartilhe seus comentários. Ficaria muito grato por qualquer contribuição!