2016-05-11 3 views
0

Versuch, die Telefonnummernüberprüfung auf Datenbankebene zu schreiben, die genau 10 Ziffern benötigt.Integer-Validierung mit genau 10 Stellen bei Migrationen

Versuchte
t.integer :phone, null: false 
t.integer :phone, null: false, size: 10 
t.integer :phone, null : false, limit: 5 

Aber es hat nicht funktioniert.

Meine Ergebnisse

:limit  Numeric Type Column Size  Max value 
1   tinyint   1 byte   127 
2   smallint  2 bytes   32767 
3   mediumint  3 bytes   8388607 
nil, 4, 11 int(11)   4 bytes   2147483647 
5..8  bigint   8 bytes   9223372036854775807 

Wenn ich nicht Grenze bestanden hat, begeht es 123 und lehnt 9999999999 zu begehen. aufgrund von nicht min Wert und max Wert (2147483647) Einschränkungen.

Sie müssen genau 10 Ziffern in die Datenbank eingeben, weniger noch mehr.

Antwort

0

size oder limit Optionen werden nicht funktionieren. Zum Beispiel limit = 9, aber wir können trotzdem eine Wertlänge = 8 speichern, das macht Sinn.

Wie wäre es gerade aktive Datensatz Validierung verwenden, es ist super einfach:

validates_length_of :phone, is: 9 

Für die Datenkonsistenz, wir

class AddMyConstraint < ActiveRecord::Migration 
    def up 
    execute "ALTER TABLE table_name ADD CONSTRAINT check_phone_length CHECK (phone >= 1000000000 AND phone <= 999999999)" 
    end 

    def down 
    execute "ALTER TABLE table_name DROP CONSTRAINT check_phone_length" 
    end 
end 
+0

Dank @Hieu eine Migration mit Einschränkung hinzufügen können, aber Ihre Lösung ist verwandte um die Validierung zu modellieren. Wenn ich 'User.new (phone: 1234567890123) .save (validate: false) 'es nicht validieren kann, so muss ich auch auf Datenbankebene einschränken. – SpunkyLive

+0

Überprüfen Sie mein Update mit DB-Einschränkung –