如何检查续集中的约束

时间:2012-04-17 18:09:50

标签: ruby sequel

如何创建CHECK约束以检查续集中的一系列可能值。一个Ruby ORM。

所有尝试似乎都会生成CHECK (1 = 0),如输出日志中所示。

这是我正在尝试使用Sequel的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)   
);

这里是Sequel架构生成代码:

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]
}

3 个答案:

答案 0 :(得分:7)

在Sequel中,检查约束的处理就像过滤表达式一样。处理案件的推荐方法是:

check(:role=>%w[a o u])

我同意更多文档可能会更好,尽管http://sequel.jeremyevans.net/rdoc/files/doc/schema_modification_rdoc.html

中有例子

答案 1 :(得分:2)

关于checkadd_constraint如何工作的文档相当稀疏,但你可以尝试完全绕过所有魔法,像在SQL中一样编写约束,并从块返回;像这样的东西:

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

CHECK约束中允许的语言非常丰富多样,所以我希望一个简单的字符串是一个选项。

答案 2 :(得分:0)

这可以通过enum来优雅地处理:

up do
  extension :pg_enum
  create_enum(:role_types, %w[a b c])
  create_table # ...
    role_types :role, null: false
#...

down do
  drop_table # :...
  drop_enum :role_types
end