如何制作一个可以混合到映射字段中的特性,以便我不必为数据库中的许多字段覆盖相同的属性?

时间:2014-09-10 19:20:59

标签: scala lift

在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
}

谢谢,

1 个答案:

答案 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]