如何创建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]
}
答案 0 :(得分:7)
在Sequel中,检查约束的处理就像过滤表达式一样。处理案件的推荐方法是:
check(:role=>%w[a o u])
我同意更多文档可能会更好,尽管http://sequel.jeremyevans.net/rdoc/files/doc/schema_modification_rdoc.html
中有例子答案 1 :(得分:2)
关于check
和add_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