2

以下に私のドメインを含めました。別の列の値に基づいて列を一意にし、親ドメイン内で一意にする一意の制約を列に指定しようとしています。

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

4

1 に答える 1

5

http://grails.org/doc/latest/ref/Constraints/unique.htmlで説明されている最後の例を試しましたか?

例: postStatus(blank:false, nullable:false, unique:['postType', 'basicProfile'])

于 2013-10-02T20:00:44.087 に答える