在Scala Lift框架中,如何创建一个可以混合到映射字段中的特性,而不必为数据库中的许多字段覆盖相同的属性?
我想在下面的代码中消除一些冗余。具体来说,我不想重复添加:
override def writePermission_? = false
override def readPermission_? = false
override def shouldDisplay_? = false
override def show_? = false
override def dbDisplay_? = false
表示几个db字段。我认为,解决这个问题的方法是写一个看起来像这样的特征:
trait PrivateField extends ...??? {
override def writePermission_? = false
override def readPermission_? = false
override def shouldDisplay_? = false
override def show_? = false
override def dbDisplay_? = false
}
然后将其混合到对象覆盖中,如下所示:
object owner extends MappedLongForeignKey(this, User) with PrivateField
object status extends MappedInt(this) with PrivateField
等。这是解决问题的好方法吗?如果是的话,有关如何编写特征的任何建议吗?下面是我想减少冗余的代码。
class Mytable extends LongKeyedMapper[Mytable] with IdPK {
def getSingleton = Myclass
object owner extends MappedLongForeignKey(this, User) {
override def writePermission_? = false
override def readPermission_? = false
override def shouldDisplay_? = false
override def show_? = false
override def dbDisplay_? = false
}
object description extends MappedString(this, 140)
object name extends MappedString(this, 140)
object status extends MappedInt(this) {
override def writePermission_? = false
override def readPermission_? = false
override def shouldDisplay_? = false
override def show_? = false
override def dbDisplay_? = false
}
object entry_number extends MappedInt(this) {
override def writePermission_? = false
override def readPermission_? = false
override def shouldDisplay_? = false
override def show_? = false
}
object quanitity extends MappedDecimal(this, MathContext.DECIMAL64, 2) {
override def writePermission_? = false
override def readPermission_? = false
override def shouldDisplay_? = false
override def show_? = false
override def dbDisplay_? = false
}
}
object Mytable extends Mytable with LongKeyedMetaMapper[Mytable] with CRUDify[Long, Mytable] {
override def editMenuLoc:Box[Menu] = Empty
override def deleteMenuLoc:Box[Menu] = Empty
override def viewMenuLoc:Box[Menu] = Empty
override def createMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in"))
override def showAllMenuLocParams: List[Loc.AnyLocParam] = List(If(User.loggedIn_? _, "Not logged in"))
override def findForList(start: Long, cnt: Int): List[Mytable] =
findAll(StartAt(start), MaxRows(cnt), By(owner, User.currentUser))
override def findForParam(in: String): Box[Mytable] =
for {
user <- User.currentUser
id <- Helpers.asLong(in)
mytable <- find(By(this.id, id), By(owner, user))
} yield mytable
}
谢谢,
答案 0 :(得分:1)
最简单的方法可能是使用self type annotation:
trait PrivateField[FieldType <: Any, OwnerType <: Mapper[OwnerType]] {
self: MappedField[FieldType, OwnerType] =>
override def writePermission_? = false
override def readPermission_? = false
override def shouldDisplay_? = false
override def show_? = false
}
然后你可以这样使用它:
MappedInt(this) with PrivateField[Int, Mytable]