4

如何创建 CHECK 约束来检查 Sequel 中的一系列可能值。一个红宝石 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]
}
4

3 回答 3

9

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

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

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

于 2012-04-17T23:01:36.257 回答
3

关于如何check以及add_constraint应该如何工作的文档相当稀少,但您可以尝试完全绕过所有魔法,像在 SQL 中那样编写约束,然后从块中返回它;像这样的东西:

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

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

于 2012-04-17T20:00:17.197 回答
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
于 2020-05-11T11:00:43.927 回答