5

In un'applicazione Rails, i nomi di colonna, i tipi ei valori predefiniti vengono dedotti direttamente dal database. Esiste un modo per inferire le convalide dai vincoli del database durante l'inizializzazione o mentre si tenta di salvare?Converti vincoli di database in convalide di Rails

Ciò consentirebbe maggiore DRYness e assicurerà che tutti i dati possano essere convalidati in modo soft prima di colpire il DB e ottenere un'eccezione, poiché le convalide coprirebbero tutti i vincoli del database. I vincoli del database sono la fonte autorevole di informazioni sull'invalidità dei dati quando vengono utilizzati.

In alternativa, è possibile eseguire il salvataggio di ActiveRecord da un vincolo di database e agire come se una convalida debole non fosse riuscita? Ciò significherebbe che i vincoli del database potrebbero essere manipolati esternamente senza riavviare o modificare l'app Rails, le prestazioni sarebbero migliorate perché le convalide di unicità non richiederebbero una query separata e anche che le convalide di unicità sarebbero immuni alle condizioni di gara.

risposta

3

È possibile utilizzare la norme di applicazione dello schema gemma:

https://github.com/twinge/enforce_schema_rules

Si convalida il vostro modello contro le regole del database che hai già creato nello schema.

Esempio:

class Person < ActiveRecord::Base 
    enforce_schema_rules :except => :dhh 
end 
+0

Buona risposta! Non l'ho provato, ma la gemma sembra molto semplice, efficace e leggera sul codice sorgente, convertendo schema.rb in validazioni, ma non ispezionando il database. Non avrebbe funzionato per il mio caso d'uso, condividendo un DB con qualcuno che continuava a cambiare lo schema con spirito malvagio, ma che sicuramente potrebbe essere usato in futuro. – user1158559