7

いずれかのフィールドで作成された日の翌日を指定する必要があるドメインクラスがあります。

class myClass {
  Date startDate
  String iAmGonnaChangeThisInSeveralDays
  static constraints = {
    iAmGonnaChangeThisInSeveralDays(nullable:true)
    startDate(validator:{
        def now = new Date()
        def roundedDay = DateUtils.round(now, Calendar.DATE)
        def checkAgainst
        if(roundedDay>now){
            Calendar cal = Calendar.getInstance();
            cal.setTime(roundedDay);
            cal.add(Calendar.DAY_OF_YEAR, -1); // <--
            checkAgainst = cal.getTime();
        }
        else checkAgainst = roundedDay

        return (it >= checkAgainst)
    })
  }
}

したがって、数日後、文字列のみを変更してsaveを呼び出すと、バリデーターが日付を再チェックしていて、現在は過去であるため、保存が失敗します。バリデーターを作成時にのみ起動するように設定できますか、それとも作成中か編集/更新中かを検出するようにバリデーターを変更する方法はありますか?

@RobHあなたの答えの使い方がよくわかりません。このエラーの原因となる次のコードがあります。

myInstance.iAmGonnaChangeThisInSeveralDays = "nachos"
myInstance.save()
if(myInstance.hasErrors()){
  println "This keeps happening because of the stupid date problem"
}
4

2 に答える 2

14

idが新しい非永続インスタンスか既存の永続インスタンスかを示す指標として設定されているかどうかを確認できます。

startDate(validator:{ date, obj ->
   if (obj.id) {
      // don't check existing instances
      return
   }
   def now = new Date()
   ...
}
于 2011-05-09T22:32:44.737 に答える
0

1 つのオプションは、検証するプロパティを指定することです。ドキュメントから:

validate メソッドは、検証する必要があるプロパティの名前を含む場合があるオプションの List 引数を受け入れます。List が validate メソッドに渡されると、List で定義されたプロパティのみが検証されます。

例:

// when saving for the first time:
myInstance.startDate = new Date()
if(myInstance.validate() && myInstance.save()) { ... }

// when updating later
myInstance.iAmGonnaChangeThisInSeveralDays = 'New Value'
myInstance.validate(['iAmGonnaChangeThisInSeveralDays'])
if(myInstance.hasErrors() || !myInstance.save(validate: false)) {
    // handle errors
} else {
    // handle success
}

組み込みの Grails の優れた機能をバイパスしているため、これは少しハッキリしています。単にsave(). よりエレガントなソリューションがあれば、他のソリューションを見てみたいと思います。

注:回避できる場合は、使用をお勧めしませんsave(validate: false)。使用方法に十分注意しない限り、予期せぬ悪影響が生じる可能性があります。代替手段が見つかった場合は、必ず代わりに使用してください。

于 2011-05-09T21:57:41.170 に答える