1

私は次のクラスを持っています:

case class Product( title : String, description: String, contract: Contract)
case class Contract(contractType: ContractType, price: Int )
case class ContractType(description: String)

およびこれらの DTO:

case class ProductDto(id: Long, title: String, description: String, contractType: ContractTypeDto, price: Int)
case class ContractTypeDto(id: Long, description: String)

製品のリストを返すメソッドを作成する必要がありますが、データは次のように DTO に入力されています。

def list = Db.query[Product].fetch().toList.map(x => ProductDto(x.id, x.title, 
    x.description, ContractTypeDto(x.contract.contractType.id, 
    x.contract.contractType.description), x.contract.price))

問題は、 x.contract.contractType.id にアクセスできないことですが、SORM ではx.id(最初のレベルで) アクセスできます。それを行う方法はありますか??

ありがとう

4

1 に答える 1

2

キャスティングアプローチ

id次のことが必要な場合は、いつでも using キャストにアクセスできます。

x.contract.contractType.asInstanceOf[ sorm.Persisted ].id

トータルアプローチ

ただし、パターン マッチングを利用して全体的な関数を生成する方がクリーンです。

def asPersisted[ A ]( a : A ) : Option[ A with sorm.Persisted ]
  = a match {
      case a : A with sorm.Persisted => Some( a )
      case _ => None
    }

次に、次のように使用できます。

asPersisted( x.contract.contractType ).map( _.id ) // produces Option[ Long ]

トータルアプローチの利点は、永続化されていない値をキャストしようとすると発生するランタイム キャスト例外から身を守ることです。

ポンピングによるトータルアプローチ

これが邪魔にならない場合は、値クラスasPersistedを使用する方法として「pimp」することもできます。Any

implicit class AnyAsPersisted[ A ]( val a : A ) extends AnyVal {
  def asPersisted : Option[ A with sorm.Persisted ]
    = a match {
        case a : A with sorm.Persisted => Some( a )
        case _ => None
      }
}

その後、次のように使用できます。

x.contract.contractType.asPersisted.map( _.id ) // produces Option[ Long ]
于 2013-05-28T18:47:02.480 に答える