Ruby 如何在Sequel中检查约束

Ruby 如何在Sequel中检查约束,ruby,sequel,Ruby,Sequel,如何创建检查约束以检查Sequel中的一系列可能值。红宝石ORM 所有尝试似乎都会生成检查(1=0),如输出日志中所示 下面是我尝试使用Sequel的DSL建模的表格: create table memberships( id integer primary key autoincrement , group_id integer references groups(id) on delete cascade , user_id integer reference

如何创建检查约束以检查Sequel中的一系列可能值。红宝石ORM

所有尝试似乎都会生成
检查(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)   
);
下面是续集模式生成代码:

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]
}
db.create_表(:成员资格){
主键:id
外键:用户id,:用户
外键:组id,:组
字符:角色,默认值:“u”

check{role=='u'或role=='a'}

关于
check
add_constraint
应该如何工作的文档非常稀少,但是您可以尝试完全绕过所有的魔法,像在SQL中一样编写约束,并从块中返回;类似这样:

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

检查约束中允许使用的语言非常丰富多样,因此我希望使用一个简单的字符串作为选项。

在Sequel中,检查约束的处理方式与筛选表达式类似。建议使用以下方法处理您的情况:

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

我同意更多的文档可能会更好,尽管

中有一些示例,这将通过
枚举优雅地处理:

up do
扩展名:pg_enum
创建枚举(:角色类型,%w[a b c])
创建_表#。。。
角色类型:角色,null:false
#...
向下做
放下桌子:。。。
删除枚举:角色类型
结束

是的,我也试过了。同样的结果。直接从马嘴里说出来!谢谢你花时间回答,伙计!谢谢你在图书馆做了这么多辛苦的工作!