I vincoli del database non sono più necessari rispetto all'utilizzo delle cinture di sicurezza nell'automobile. Puoi guidare tutto ciò che ti piace e tutto funzionerà alla grande fino all'arrivo di un problema. La cintura di sicurezza (vincoli) ti tiene al sicuro (i dati).
Quindi è altamente raccomandato creare vincoli per imporre l'integrità dei dati a livello di database, perché è altamente probabile che 1) interagirai con il database ad un certo punto al di fuori di Rails e 2) Farai un errore in il tuo codice che causa dati non validi.
I vincoli del database possono essere più utili, ma consente di risparmiare un sacco di lavoro, soprattutto quando il codice può fare ipotesi sui dati e non deve fare tonnellate di controlli di validità.
La ragione per cui ActiveRecord non supporta le chiavi esterne out-of-the-box è perché è inteso per essere indipendente dal database e le chiavi esterne non sono universalmente supportate da tutti i sistemi di database.
Mi piace l'analogia con la cintura di sicurezza! – Zabba
Un altro motivo: a meno che l'app Rails non sia un processo, un thread, eseguito su un singolo server, può elaborare più richieste contemporaneamente. Cose come 'convalida: username, unicità: true' possono fallire in questo caso, perché ogni istanza dell'app controlla il nome utente richiesto, non lo trova e lo inserisce. Solo un indice unico lo impedisce. In generale, qualsiasi controllo come "questo dato è valido dato cosa c'è nel database ** adesso **?" può essere fatto in modo affidabile solo dal database stesso. –