2013-08-25 15 views
0

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

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

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

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

варианта Пар Я рассматриваю является:

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

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

+1

кажется, что Стрингфилд также имеет 'метод setFilter', а также, по крайней мере, в соответствии с API: http://liftweb.net/api/25/api/#net. liftweb.record.field.StringField. Подпись - 'setFilter: List [(ValueType) ⇒ ValueType]'. Разве это не сработает? – jcern

+0

@jcern, вы абсолютно правы, я не знаю, как я это пропустил. Я честно проверил этот метод, возможно, было слишком поздно, и мой мозг сдавался :) Большое спасибо. –

ответ

0

Заслуга @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}