2016-05-22 17 views
1

我有一个Ruby/Padrino项目使用Sequel ORM访问MySQL中的遗留数据库。我遇到的问题是几个表有一个用户可编辑的列也是一个主键。在Sequel ORM中捕获约束错误之前服务器

我试图设置续集来捕捉应用程序本身内的任何重复错误,然后MySQL可以抛出错误。我认为Sequel中的验证助手可以帮助我做到这一点,但似乎在保存数据之前他们没有进入。

我的SQL表定义为:

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

和我的续集模型定义如下:

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(...)'很好。专业提示:我必须首先执行'Location.unrestrict_primary_key',因为':code'是我手动更改的PK。 – CyberFerret