4

Sequelで可能な値の範囲をチェックするためのCHECK制約を作成するにはどうすればよいですか。RubyORM。

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 に答える