2012-04-17 27 views
2

如何創建CHECK約束來檢查Sequel中的可能值範圍。一個Ruby ORM。如何檢查續集中的約束條件

在輸出日誌中看到的所有嘗試似乎都會生成CHECK (1 = 0)

這裏是我試圖用續集的DSL模型表:

create table memberships( 
     id integer primary key autoincrement 
    , group_id integer references groups(id) on delete cascade 
    , user_id integer references users(id) on delete cascade 
    , role char check (role in ('u','a','o')) default 'u' 
    , unique(group_id, user_id, role) 
); 

和這裏的續集模式生成代碼:

db.create_table(:memberships){ 
    primary_key :id 
    foreign_key :user_id, :users 
    foreign_key :group_id, :groups 
    char :role, default: 'u' 
    check{role=='u' or role=='a'} #<-----this line generates CHECK (1 = 0) 
    unique [:user_id, :group_id, :role] 
} 
+0

啊,試過一個了。同樣的結果。 – rebnoob 2012-04-17 18:59:39

+0

完美!隊友的歡呼聲! – rebnoob 2012-04-17 19:50:06

回答

2

如何checkadd_constraint的文檔都應該工作是相當稀疏的,但你可以嘗試完全繞過所有的魔法,像在SQL中那樣編寫約束,然後從塊中返回;像這樣:

db.create_table(:memberships) { 
    #... 
    check { "role in ('a', 'o', 'u')" } 
    #... 
} 

在CHECK約束中允許的語言是相當豐富和多樣的,所以我期望一個簡單的字符串是一個選項。