3

ConfigurationHolder.config.support.reminder.web.person.max私には制限があるので、保存されているオブジェクト以上のものはありません 。特定のプロパティに関連しないバリデーターを追加する方法が見つかりませんでした。ということで、とりあえずこんな感じで実装。それをより良くする方法はありますか?

package support.reminder.web

import org.codehaus.groovy.grails.commons.ConfigurationHolder;

class Person {

    String firstName
    String lastName
    String email
    Date lastDutyDate

    static constraints = {
        firstName(blank: false)
        lastName(blank: false)
        email(blank: false, email: true)
        lastDutyDate(nullable: true)
        id validator: {val ->
        if (val)
            Person.count() <= ConfigurationHolder.config.support.reminder.web.person.max
        else
            Person.count() < ConfigurationHolder.config.support.reminder.web.person.max
    }
    }

    String toString() {
        "[$firstName $lastName, $email, $lastDutyDate]"
    }
}
4

3 に答える 3

5

Grails Custom Constraints Pluginを使用して、検証の実装を管理できます。次に、定義済みの Grails 制約と同様に、独自の制約を呼び出すことができます。

package support.reminder.web

import org.codehaus.groovy.grails.commons.ConfigurationHolder as CH

class Person {

    String firstName
    String lastName
    String email
    Date lastDutyDate

    static constraints = {
        firstName(blank: false)
        lastName(blank: false)
        email(blank: false, email: true)
        lastDutyDate(nullable: true)
        id(maxRows: CH.config.support.reminder.web.person.max)
    }

}

または、サードパーティのプラグインに依存したくない場合は、サービス メソッド内にカスタム バリデーターのロジックを実装し、ドメイン内のカスタム バリデーターから呼び出すことができます。

package support.reminder.web

import org.codehaus.groovy.grails.commons.ConfigurationHolder as CH

class Person {

    def validationService
    String firstName
    String lastName
    String email
    Date lastDutyDate

    static constraints = {
        firstName(blank: false)
        lastName(blank: false)
        email(blank: false, email: true)
        lastDutyDate(nullable: true)
        id (validator: {val ->
           validationService.validateMaxRows(val, CH.config.support.reminder.web.person.max)
        }
    }

}
于 2011-01-28T07:22:50.900 に答える
0

良い考えはありませんが、< ではなく <= を確認する必要があるかもしれません。オブジェクトを検証するとき、まだDBに格納されていないため、Person.count()には含まれないと思います。<= を指定すると、検証に合格してから保存されるため、ルールに違反していると思います。

于 2011-01-19T08:40:24.053 に答える
0

personService.addPerson() のようなサービス関数を使用することをお勧めします。次に、新しいオブジェクトを保存する前に制約を確認してください。たとえば、多くのドメイン オブジェクトに関連する場合など、より複雑な制約を取得する場合に役立ちます。

オブジェクトの数を制限するためのバリデーターの使用は、バリデーターの意味について懸念している場合、実際にはあまり良くありません。オブジェクトは有効ですが、オブジェクトの数だけが大きすぎます。

つまり、論理コードはサービスに送られます。

于 2011-01-20T03:09:50.727 に答える