2016-05-22 12 views
1

У меня есть проект Ruby/Padrino с использованием Sequel ORM для доступа к устаревшей базе данных в MySQL. Проблема, которую я испытываю, состоит в том, что в нескольких таблицах есть редактируемый пользователем столбец, который также является Первичным ключом.Ошибки ограничения прерываний в продолжении ORM перед сервером

Я пытаюсь настроить Sequel, чтобы поймать любые ошибки дублирования в самом приложении, прежде чем MySQL сможет выдать ошибку. Я предположил, что помощники проверки в Sequel могут помочь мне сделать это, но, похоже, они не пинают до того, как данные будут сохранены.

My SQL таблица определяется как:

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

и мои модели Sequel определяются следующим образом:

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

проблема теперь, когда я пытаюсь следующий код для вставки Расположение кода " ABC 'в базу данных (если там есть еще одна строка с кодом «ABC»), Ruby выдает следующую ошибку:

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' 

Я неправильно сконфигурировал свои проверки или есть другой плагин, который мне нужно вызвать?

ответ

1

insert - метод уровня данных, валидации - это уровень модели. Вероятно, вы захотите использовать create вместо insert.

+0

Спасибо - я не узнал разные уровни между наборами данных и моделью. 'Location.create (...)' отлично работает. Pro Tip: Мне сначала нужно было сделать «Location.unrestrict_primary_key», так как «код» - это ПК, который я меняю вручную. – CyberFerret