2016-05-22 3 views
1

Ich habe ein Ruby/Padrino-Projekt, das Sequel ORM verwendet, um auf eine Legacy-Datenbank in MySQL zuzugreifen. Das Problem, das ich habe, ist, dass mehrere der Tabellen eine benutzerdefinierbare Spalte haben, die auch ein Primärschlüssel ist.Überfüllungsbedingungsfehler in Sequel ORM vor dem Server

Ich versuche, Sequel einzurichten, um alle Duplikationsfehler innerhalb der Anwendung selbst zu fangen, bevor MySQL einen Fehler werfen kann. Ich nahm an, dass die Validierungshelfer in Sequel mir dabei helfen könnten, aber es scheint, dass sie nicht eingreifen, bevor die Daten gespeichert werden.

ist My SQL-Tabelle wie folgt definiert:

CREATE TABLE `dblocations` (
    `code` varchar(3) NOT NULL, 
    `description` varchar(100) NOT NULL, 
    PRIMARY KEY (`code`) 
) 

und meine Sequel-Modelle sind wie folgt definiert:

class Location < Sequel::Model(:dblocations) 
    plugins :validation_helpers 
    def validate 
    super 
    validates_presence [:code, :description] 
    validates_unique :code 
    end 
end 

das Problem ist jetzt, wenn ich den folgenden Code versuchen Location Code "einfügen ABC 'in die Datenbank (wenn dort bereits eine andere Zeile mit dem Code' ABC 'vorhanden ist), gibt Ruby den folgenden Fehler aus:

Location.insert(:code => "ABC", :description => "Test Location") 

ERROR - Mysql2::Error: Duplicate entry 'ABC' for key 'PRIMARY': INSERT INTO `dblocations` (`code`, `description`) VALUES ('ABC', 'Test Location') 
Sequel::UniqueConstraintViolation: Mysql2::Error: Duplicate entry 'ABC' for key 'PRIMARY' 

Habe ich meine Validierungen falsch konfiguriert oder gibt es ein anderes Plugin, das ich aufrufen muss?

Antwort

1

insert ist eine Methode auf Datensatzebene, Validierungen sind Modellebene. Sie möchten wahrscheinlich create anstelle von insert verwenden.

+0

Danke - Ich habe die verschiedenen Ebenen zwischen Datensätzen und Modell nicht erkannt. 'Location.create (...)' funktioniert super. Profi-Tipp: Ich musste zuerst 'Location.unrestrict_primary_key' auch tun, da' 'code' 'eine PK ist, die ich manuell ändere. – CyberFerret