Todo hacker que trabalhou com
Ruby On Rails está familiarizado com o
ORM ActiveRecord . Discutiremos uma das validações propostas prontamente, a saber, validações por exclusividade e por que o gem
database_validations salvará a consistência do seu banco de dados.
Digamos que você tenha um modelo de usuário com exclusividade no campo de
email , ou seja,
class User < ApplicationRecord validates :email, uniqueness: true end
Você já deve saber que esta validação executa a seguinte solicitação
SELECT 1 FROM users WHERE email = $1
toda vez que tentamos salvar um registro no banco de dados.
Essa abordagem tem várias desvantagens:
Primeiramente , a execução de uma solicitação adicional e, se várias validações de exclusividade forem inicializadas no modelo, a solicitação será executada para cada uma delas. Isso não é eficiente e também requer índices se queremos que essas consultas sejam executadas rapidamente.
Em segundo lugar , essa solução não garante exclusividade devido a uma possível
corrida por dados . Várias operações competitivas podem aprender simultaneamente sobre a ausência de um registro específico, como resultado, para manter os mesmos dados.
Obviamente, casos raros com corrida de dados podem ser resolvidos adicionando uma restrição de exclusividade no nível do banco de dados. Mas, nesse caso, você não receberá um erro de validação, a consulta ao banco de dados simplesmente cairá e a transação inteira será revertida.
Nessa situação, o gem
database_validations ajudará, o que fornece compatibilidade entre restrições e validações do banco de dados.
O principal significado de gem é apresentado no seguinte código:
def save(options = {}) ActiveRecord::Base.connection.transaction(requires_new: true) { super } rescue ActiveRecord::RecordNotUnique => e Helpers.handle_unique_error!(self, e) false end
Assim, tentamos salvar os dados, se todas as outras validações forem aprovadas, se a transação cair e reverter, analisamos o erro e atribuímos os valores corretos aos
errors
nosso objeto.
Após revisar a
documentação e os
benchmarks , podemos concluir que essa gema acelerará o processo de salvar registros no banco de dados pelo menos duas vezes.
Graças ao suporte de bancos de dados como
PostgreSQL ,
SQLite ,
MySQL e compatibilidade com
validates_uniqueness_of
, o processo de substituição por
validates_db_uniqueness_of
leva uma questão de minutos.
Um prático comparador para o RSpec também está presente imediatamente:
specify do expect(described_class) .to validate_db_uniqueness_of(:field) .with_message('duplicate') .with_where('(some_field IS NULL)') .scoped_to(:another_field) .with_index(:unique_index) end
Ao mudar para uma nova validação, você precisa ter restrições de exclusividade no banco de dados, mas se elas ainda não estiverem lá, o gem indicará isso quando o aplicativo for iniciado.
A gema foi testada em um aplicativo com mais de 100 validações de exclusividade entre mais de 50 modelos.
Use gem e compartilhe sua opinião. Qualquer contribuição para o desenvolvimento é bem-vinda!