2010-11-02 14 views
8

Jestem nowicjuszem w grails i groovy. Mam klasy domeny Project z datą rozpoczęcia i zakończenia. Chcę wprowadzić ograniczenie określające, że data końcowa musi być większa niż data początkowa (a następnie kolejny obiekt podrzędny projektu musi mieć datę rozpoczęcia i datę zakończenia sprawdzać z datami rodzica Projektu). Czy to możliwe przy minimalnym ograniczeniu, czy też muszę go umieścić w innym miejscu? Unikalne ograniczenie pozwala na połączenie dwóch właściwości w ten sposób, mając nadzieję, że ograniczenia minimalne i maksymalne na to pozwalają. PróbowałemOgraniczenie grails min do sprawdzania daty

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

zgłasza błąd mówiąc startDate nieruchomość nie jest dostępna w Projekcie

+0

Moja odpowiedź brzmi, zakładając, że 'endDate' jest zdefiniowany jako' java.util.Date'. Czy to jest poprawne? Jeśli nie, proszę podać, co to jest, a ja odpowiednio zaktualizuję swoją odpowiedź. –

+0

Tak, jest to standardowa data. Miałem nadzieję, że ograniczenie min też się do tego zastosuje. Dzięki za odpowiedź :) Tak więc, min dotyczy tylko liczb całkowitych, prawda? –

+0

Cóż, 'min' może zastosować dokładnie na wartości' Date'. Nie sądzę jednak, aby można było użyć wartości dynamicznej (tj. Innej wartości pola) w definicji ograniczenia dla 'min', ponieważ' wiązania' to zamknięcie statyczne. Możesz zrobić 'endDate (min: new Date())', bez żadnych problemów. –

Odpowiedz

13

Spróbuj użyć niestandardowego walidator:

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

val jest wartość pola i obj jest odniesieniem do sprawdzanego obiektu. Zamknięcie może zawierać dowolną logikę, której potrzebujesz, dzięki czemu możesz rozszerzyć swoją walidację w sposób, który opisujesz w swoim pytaniu (poprzez dostęp do obiektów podrzędnych, do których odwołujesz się przy użyciu obj).

Własny weryfikator jest dość elastyczny. Spójrz na the documentation. Idealnie powinieneś zwrócić niestandardową wiadomość; jak to zrobić można również znaleźć w dokumentach połączonych powyżej.

Powiązane problemy