Próbuję zrobić EnumListField
w Lift / Record / Squeryl, podobnie jak MappedEnumList
w LiftMapper
. Typ przechowywania powinien być Long / BIGINT. Rozumiem, że jeśli zdefiniuję:
def classOfPersistentField = classOf[Long]
Wtedy Squeryl będzie wiedział, że powinien utworzyć kolumnę BIGINT. I wiem, że używa setFromAny()
do ustawiania wartości, przekazując Long. Jedyny element, którego nie dostaję, to:
Jak odczyta wartość pola? Jeśli użyje valueBox
, otrzyma Seq[Enum#Value]
i nie będzie wiedział, jak zmienić to w Long.
Jak powiedzieć Squeryl, aby zamieniła mój Seq[Enum#Value]
na Long, lub zdefiniować „getter”, który zwraca Long i który nie powoduje konfliktu z „normalnymi” metodami pobierającymi?
Odpowiedzi:
nieprawidłowo implementujesz logikę walidacji. Prawidłowym sposobem sprawdzenia poprawności pola rekordu jest przesłonięcie
def validations: List[ValidationFunction]
gdzie ValidationFunction jest aliasem typu
type ValidationFunction = ValueType => List[FieldError]
aw twoim przypadku ValueType == String.
Następnym problemem jest cecha domeny. Ponieważ wywołanie walidacji jest wbudowane w definicję klasy, zostanie wywołane podczas konstruowania pola.
źródło