以下に私のドメインを含めました。別の列の値に基づいて列を一意にし、親ドメイン内で一意にする一意の制約を列に指定しようとしています。
public enum PostStatus {
PUBLISHED,
PENDING_REVIEW,
DRAFT,
TRASH
}
public enum PostType {
INTRO,
FUTURE,
FAMILY
}
class Post {
String content
PostType postType
PostStatus postStatus
Date dateCreated
Date lastUpdated
static belongsTo = [basicProfile:BasicProfile]
static constraints = {
content(blank:true, nullable:true, maxSize:5000)
postType(blank:false, nullable:false)
postStatus(blank:false, nullable:false, unique:'postType') //status must be unique within each postType, and within the parent.
}
static mapping = {
content sqlType:'text'
}
}
class Profile {
static hasMany = [
post:Post
]
}
現在、postStatus は postType 内で一意ですが、一意の制約が Post テーブルに適用されます。そのため、テーブルでは postType ごとに 1 つの postStatus が許可され、一意の制約違反が発生します。必要なのは、各プロファイルの postType ごとに 1 つの一意の postStatus です。
投稿テーブルの挿入例: 良いレコード #1: プロファイル ID: 1 post_status: DRAFT post_type: INTRO
良い記録 #2: プロファイル ID: 1 post_status: PUBLISHED post_type: INTRO
良い記録 #3: プロファイル ID: 1 post_status: DRAFT post_type: FUTURE
悪いレコード #4 は、別のプロファイル ID であっても、レコード 1 で一意の制約に違反しています。プロファイル ID: 2 post_status: DRAFT post_type: INTRO
投稿はプロファイルに属しているため、プロファイルごとに一意にするための制約をどのように定義すればよいでしょうか? 基本的に、私は複合一意キーを取得しようとしています:
profile.id + postType + postStatus