2011-11-10 21 views
10

Voglio limitare i valori disponibili per un campo. Quindi il valore della colonna deve essere specificato da un insieme di valori. È possibile utilizzare la migrazione/i modelli? O devo farlo manualmente nel mio DB?Come limitare i valori per una colonna

risposta

24

Userete convalide per questo c'è a whole Rails guide on the topic La specifica aiutante che stai cercando in questo caso è :inclusion, ad esempio:

class Person < ActiveRecord::Base 
    validates :relationship_status, 
    :inclusion => { :in => [ 'Single', 'Married', 'Divorced', 'Other' ], 
    :message => "%{value} is not a valid relationship status" } 
end 

Edit agosto 2015: Come di Rails 4.1, è possibile utilizzare il metodo enum classe per questo è necessario che la vostra colonna essere un. tipo intero:

class Person < ActiveRecord::Base 
    enum relationship_status: [ :single, :married, :divorced, :other ] 
end 

Si definisce automaticamente alcuni metodi pratici anche per te:

p = Person.new(relationship_status: :married) 

p.married? # => true 
p.single? # => false 

p.single! 
p.single? # => true 

Potete leggere la documentazione per enum qui: http://api.rubyonrails.org/v4.1.0/classes/ActiveRecord/Enum.html

+0

È possibile impostare il livello di migrazione? – damluar

+2

È possibile impostare vincoli a livello di database - MySQL e PostgreSQL hanno un tipo di colonna 'ENUM', ad esempio, ma SQLite e Oracle no - ma Rails non li supporta direttamente. Puoi utilizzare tipi di colonna non supportati come ad es. 'tcolonna: col nome, 'CUSTOM SQL TYPE'', ma finirai per fare un sacco di gestione personalizzata di quei valori e non sarai in grado di eseguire tali migrazioni su un RDBMS diverso, motivo per cui (tra altri) la documentazione in particolare mette in guardia contro di esso. –

+0

Grazie, amico. Hai aiutato molto! – damluar

2

Dipende dalla quantità di sicurezza necessaria. Puoi semplicemente aggiungere un validatore al tuo modello per restringerlo a quei valori, ma non sarai sicuro che i dati esistenti corrisponderanno (e causeranno fallimenti successivi a causa della convalida) e che altre modifiche potrebbero essere apportate da altre app/sql raw che lo aggirerebbe.

Se si desidera una riservatezza assoluta, utilizzare il database.

Ecco cosa si potrebbe desiderare di usare se lo si fa nel database (che è abbastanza limitato rispetto a quello che un validatore rotaie potrebbe fare:.. http://www.w3schools.com/sql/sql_check.asp

+0

Grazie, sì, lo so sulla convalida. E posso specificare le mie restrizioni nel file di migrazione? – damluar

+1

È possibile creare una migrazione che trova quelli che non corrispondono e li aggiorna/cancella. Attenzione però: se utilizzi i tuoi modelli nella tua migrazione, potresti far inciampare le persone se i loro modelli non sono sincronizzati con ciò che la migrazione si aspetta. – Ponny

+0

Grazie per l'aiuto! – damluar

Problemi correlati