2010-11-02 60 views
8

我是grails和groovy的新手。我有一個具有開始和結束日期的Project域類。我想要放入一個約束,指定結束日期需要大於開始日期(然後,項目的另一個子對象需要使用父項目的日期來驗證其startdate和enddate)。這是可能的最小約束,還是我必須把它放在其他地方?唯一約束確實允許以這種方式鏈接兩個屬性,希望最小/最大約束允許這樣做。 我試圖Grails最小限制日期驗證

startDate(blank:false) 
endDate(blank:false, min:'startDate') 

它拋出一個錯誤說屬性的startDate上沒有項目

+0

我的答案是假設'endDate'被定義爲'java.util.Date'。它是否正確?如果不是,請說明它是什麼,我會相應地更新我的答案。 – 2010-11-02 19:08:20

+0

是它的正常日期。希望最小限制也適用於此......感謝答案:)所以,min只適用於整數,對吧? – 2010-11-02 19:28:24

+0

那麼,'min'可以很好地應用於'日期'值。然而,我不相信你可以在'min'的約束定義中使用動態值(即另一個字段值),因爲'constraints'是一個靜態閉包。不過,你可以做'endDate(min:new Date())',沒有問題。 – 2010-11-02 19:32:24

回答

13

嘗試使用自定義的驗證:

static constraints = { 
    endDate(validator: { val, obj -> 
     val?.after(obj.startDate) 
    }) 
} 

val的領域和obj的價值是對被驗證對象的引用。閉包可以包含任何您需要的邏輯,所以您可以按照您在問題中描述的方式擴展驗證(通過訪問使用obj引用的子對象)。

自定義驗證器非常靈活。看看the documentation。理想情況下,您需要返回自定義消息;如何做到這一點,也可以在上面鏈接的文檔中找到。