Как применять преобразования/фильтры к полю записи подъема перед записью/чтением его значения

Я использую постоянство Lift Record и хочу применять некоторые преобразования к полю всякий раз, когда я устанавливаю или получаю его значение. Например, для StringField я хочу автоматически установить нижний регистр в объекте Record.

object someField extends StringField(this, 64) {
   ...
   // how do I apply transformations here?
   ...
}

В Lift Mapper есть метод setFilter, который делает именно это, но я не могу найти его эквивалент в Record. В маппере это выглядит так:

object someField extends MappedString(this, 64) {
   ...
   override def setFilter = trim _ :: toUpper _ :: super.setFilter
   ...
}

Пара вариантов, которые я рассматриваю:

  • переопределить метод set, но их много, я боюсь не полностью переопределить подмножество необходимых методов, поэтому я не могу представить себе последствия. :)
  • использование обратных вызовов жизненного цикла - кажется излишним.

Любая помощь приветствуется. Спасибо ;)


person yǝsʞǝla    schedule 25.08.2013    source источник
comment
Кажется, что StringField также имеет метод setFilter, по крайней мере, согласно API: liftweb.net/api/25/api/#net.liftweb.record.field.StringField Подпись: setFilter: List[(ValueType) ⇒ ValueType]. Это не сработает?   -  person jcern    schedule 26.08.2013
comment
@jcern, ты абсолютно прав, я не знаю, как я это пропустил. Я честно проверял этот способ, может быть уже поздно и мозг сдавал :) Большое спасибо.   -  person yǝsʞǝla    schedule 26.08.2013


Ответы (1)


Кредит принадлежит @jcern за указание на это:

Запись имеет метод def setFilter: List[(ValueType) ⇒ ValueType], который очень похож на def setFilter: List[(FieldType) ⇒ FieldType].

Он используется так же, т.е. фильтр будет применяться при установке или запросе значений. Вот краткий пример:

class Tag extends MongoRecord[Tag] with ObjectIdPk[Tag] {
  ...
  object name extends StringField(this, 32) {
    override def setFilter = trim _ :: toLower _ :: super.setFilter
  }
  ...
}

Tag.createRecord.name("UPPER")                
// lowercases tag name:
//res1: Tag = class Tag={name=upper, _id=521bb306e4b04eacd74dd217}
person yǝsʞǝla    schedule 26.08.2013