2014-09-16 3 views
0

나는 나의 모델을 정의했습니다 :MappedLongForeignKey를 확장하는 객체와 함께 특성을 혼합하여 def asHtml 및 def validSelectValues를 재정의하는 방법은 무엇입니까? 다음과 같이

object Curr extends Curr with LongKeyedMetaMapper[Curr] with CRUDify[Long, Curr] { 

} 
class Curr extends LongKeyedMapper[Curr] with IdPK with CreatedUpdated { 
    def getSingleton = Curr 
    object code extends MappedString(this, 100) 
    object name extends MappedString(this, 100) 
} 

object Country extends Country with LongKeyedMetaMapper[Country] with CRUDify[Long, Country] { 
} 
class Country extends LongKeyedMapper[Country] with IdPK with CreatedUpdated { 
    def getSingleton = Country 
    object name extends MappedString(this, 100) 
    object currid extends MappedLongForeignKey(this, Curr) { 
     override def asHtml = { 
      <span>{Curr.find(By(Curr.id, this)).map(c => (c.name + " " + c.code)).openOr(Text(""))}</span> 
     } 
     override def validSelectValues: Box[List[(Long, String)]] = 
     Full(Curr.findAll(OrderBy(Curr.name, Ascending)).map(c => (c.id.is, c.code.is))) 
    } 
} 

나는 많은 그런 모델이있을 것이다, 나는 외래 키있을 것이다 많은 모델 asHtmlvalidSelectValues 정의의 중복을 제거 할. 수행, 위의 기록으로,

trait MyField[T <: LongKeyedMetaMapper[T] with IdPK] { 
    val MyModel: T 
    override def asHtml = { 
    <span>{MyModel.find(By(MyModel.id, this)).map(c => (c.name + " " + c.name)).openOr(Text(""))}</span> 
    } 
    override def validSelectValues: Box[List[(Long, String)]] = 
    Full(MyModel.findAll(OrderBy(MyModel.name, Ascending)).map(c => (c.id.is, c.name.is))) 
} 

내 특성 : 형질을 가진

object currid extends {val MyModel = Curr } MappedLongForeignKey(this, Curr) with MyField[Curr] { 

같은 것을 정의되는 : 나는 다음과 같이 내 모델에 혼합 것 특성 MyField이 할 수있는 생각 작동하지. 나는 각 MyModelname 구성원을해야합니다 있는지 확인합니다

No implicit view available from net.liftweb.mapper.MyField[T] => Long. 
[error]  <span>{MyModel.find(By(MyModel.id, this)).map(c => (c.name + " " + c.name)).openOr(Text(""))}</span> 
[error]       ^
value name is not a member of type parameter T 
[error]  Full(MyModel.findAll(OrderBy(MyModel.name, Ascending)).map(c => (c.id.is, c.name.is))) 
[error]          ^

: 여기에 컴파일러가 생성하는 오류입니다. 누구든지이 특성을 구현하는 방법에 대해 조언 할 수 있습니까?

감사합니다.

+1

당신의 코드 스 니펫. 그러면 질문이 더 명확하고 읽기 쉽습니다. –

+0

@Core_Dumped, 감사합니다. 저는 Country가 Curr과 관련이 있고, Curr이 필요한 분야를 가지고 있다는 것을 보여주고 싶었습니다. 나는 세 줄을 제거했다. –

답변

1

해결책을 찾았습니다. 내 자신의 KeyedMapper, MetaMapper 및 MappedForeignKey를 만들었습니다. MyData 및 MyForeignData 예제에는 두 개의 데이터베이스 테이블이 있고 MyData에는 MyForeignData에 대한 외래 키가 들어 있습니다. CRUDify이 포함되어 있으며 브라우저에서 볼 및 외래 키를 편집 할 수 있습니다, 데프 테이블 열 재정의 표시 primaryKeyDisplayField = table_column_field

import scala.xml._ 
import net.liftweb.common._ 
import net.liftweb.mapper._ 
import net.liftweb.util._ 

trait MyMapper[OwnerType <: MyMapper[OwnerType]] 
    extends LongKeyedMapper[OwnerType] with IdPK { 
    self: OwnerType => 
} 

trait MyMetaMapper[A <: MyMapper[A]] 
    extends LongKeyedMetaMapper[A] 
    with LongCRUDify[A] { 
    self: A => 
    def primaryKeyDisplayField: BaseOwnedMappedField[A] = null 
} 

abstract class MyMappedForeignKey[T<:MyMapper[T], O<:MyMapper[O]](theOwner: T, _foreignMeta: => MyMetaMapper[O]) 
    extends MappedLongForeignKey[T, O](theOwner, _foreignMeta) { 
    override def foreignMeta = _foreignMeta 
    override def dbIndexed_? = true 
    override def asHtml = { 
    <span>{foreignMeta.findByKey(this.get) 
     .map(_.fieldByName(foreignMeta.primaryKeyDisplayField.name).openOr(Text("Error"))).openOr(Text("ERROR MyMappedForeignKey"))}</span> 
    } 
    override def validSelectValues/*: Box[List[(Long, String)]]*/ = { 
    Full(foreignMeta.findAll(/*OrderBy(foreignMeta.primaryKeyField, Ascending)*/) 
     .map(i => (i.id.get, 
      i.fieldByName(foreignMeta.primaryKeyDisplayField.name).openOr(Text("ERROR")).toString()))) 
    } 
} 

class MyData extends MyMapper[MyData] { 
    def getSingleton = MyData 
    object myForeignData extends MyMappedForeignKey(this, MyForeignData) 
    object name extends MappedString(this, 30) 
} 

object MyData extends MyData with MyMetaMapper[MyData] { } 

class MyForeignData extends MyMapper[MyForeignData] { 
    def getSingleton = MyForeignData 
    object name extends MappedString(this, 30) 
} 

object MyForeignData extends MyForeignData with MyMetaMapper[MyForeignData] { 
    override def primaryKeyDisplayField = name 
} 
당신은 아마 모든 '그다지 중요하지'세부에서 생략한다