2016-05-22 18 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