0

GORM とリレーショナル マッピングについて理解しようとしています。関係はうまくいっていますが、問題が 1 つあります。MailAddress追加されたすべてMailingListのアドレスが一意のアドレスを持つことを保証することはできません。これを行うために必要な効率的な方法は何でしょうか?

注:には一意の制約はありませんMailAddress.address。同一のアドレスが同じテーブルに存在する可能性があります。

class MailAddress {

    String name
    String email

    static belongsTo = MailingList

    static constraints = {
        name blank:true
        email email:true, blank:false
    }
}

class MailingList {

    String name

    static hasMany = [addresses:MailAddress]

    static mapping = {
        addresses cascade: 'all-delete-orphan'
    }

    static constraints = {
        name blank:false
    }
}
4

2 に答える 2

1

@ibaralf のコメントで述べたように、答えはカスタム バリデータです。すべてのアドレス ( ) が一意の電子メールアドレスを持っているMailingListかどうかを検証するために必要なクラス。MailAddress

この制約をMailingListクラスに追加したところ、機能しました。

static constraints = {
    name blank:false

    addresses(validator: {

        if (!it) {
            // validates to TRUE if the collection is empty
            // prevents NULL exception
            return true
        }

        // Grab a collection with all e-mailaddresses in the list
        def addressCollection = it*.email
        // Compare to a collection with only unique addresses
        return addressCollection == addressCollection.unique()
    })
}

詳細については、http://grails.org/doc/2.2.0/ref/Constraints/validator.htmlを参照してください。

于 2013-03-13T06:42:53.667 に答える
0

追加できる一意の制約があります。

static constraints = {
    name blank:true
    email email:true, blank:false, unique: true
}

=> email 変数に一意の制約を設定します ( unique: true )。これにより、同一の電子メール アドレスがテーブルに保存されるのを防ぐことができます。

于 2013-03-12T21:00:21.530 に答える