2014-09-10 4 views
0

스칼라 리프트 프레임 워크에서 매핑 된 필드에 혼합 할 수있는 특성을 만들어 데이터베이스의 여러 필드에 대해 동일한 속성을 재정의 할 필요가 없도록 만드는 방법은 무엇입니까?매핑 된 필드에 혼합 할 수있는 특성을 만들어 데이터베이스의 여러 필드에 대해 동일한 속성을 재정의 할 필요가 없도록 만드는 방법은 무엇입니까?

아래 코드에서 일부 중복성을 제거하고 싶습니다. 구체적으로 말하면 반복해서 추가하지 않으려는 것입니다 :

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

가장 간단한 방법은 사용하는 아마하는 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] 
+0

션, 주셔서 감사합니다 응답. 나는 당신이 그것을 올렸을 때 정확히 복사하고 붙여 넣었지만, 다음과 같은 오류가 있습니다 :'trait MappedField는 타입 매개 변수를 취합니다 [오류] self : MappedField =>'어떻게 해결할 수 있습니까? –

+0

필드에 입력 할 수 있도록 특성에 유형 매개 변수를 추가해야합니다. –

+0

Sean - 감사합니다! 단 하나의 변경이 필요합니다 :'Mapper [OwnerType]'뒤에 누락 된 닫는 대괄호를 추가해야합니다. (Mapper [OwnerType]]'(나는 이것을 직접 수정하려했으나 적어도 6 자 이상이어야합니다. 이 편집은 단 한 문자 일 것입니다). –