在服务器之前的Sequel ORM中捕获约束错误

时间:2016-05-22 23:22:40

标签: ruby sinatra sequel padrino

我有一个使用Sequel ORM的Ruby / Padrino项目来访问MySQL中的遗留数据库。我遇到的问题是,有几个表具有用户可编辑列,也是主键。

我正在尝试设置Sequel来捕获应用程序本身中的任何重复错误,然后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 个答案:

答案 0 :(得分:1)

insert是数据集级方法,验证是模型级别。您可能希望使用create代替insert