Ruby 如何在Sequel中检查约束
如何创建检查约束以检查Sequel中的一系列可能值。红宝石ORM 所有尝试似乎都会生成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
检查(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
#...
向下做
放下桌子:。。。
删除枚举:角色类型
结束
是的,我也试过了。同样的结果。直接从马嘴里说出来!谢谢你花时间回答,伙计!谢谢你在图书馆做了这么多辛苦的工作!