2013-08-25 35 views
0

我正在使用電梯記錄持久性,並且每當設置或獲取其值時,我都想在字段上應用一些轉換。例如,對於StringField,我想在Record對象中自動將它設置爲小寫。如何在寫入/讀取其值之前在電梯記錄字段上應用轉換/過濾器​​

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

在電梯映射器有一個方法setFilter這正是這麼做的,但我找不到它的記錄等同。在映射它看起來像這樣:

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

夫婦選項有:

  • 覆蓋set方法,但也有很多人,恐怕不完全覆蓋的所需的方法集,所以我不能預見後果。 :)
  • 使用生命週期回調 - 似乎是矯枉過正。

任何幫助表示讚賞。感謝;)

+1

看來StringField也有一個'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} 
相關問題