2014-01-12 7 views
5

Um einen ReSTfull-API-Stack zu implementieren, muss ich Daten, die aus einem DB extrahiert wurden, in das JSON-Format konvertieren. Ich denke, dass der beste Weg ist, Daten aus der DB zu extrahieren und dann den Zeilensatz in JSON zu konvertieren, wobei Json.toJson() als Argument eine Fallklasse verwendet, nachdem ein impliziter Serialisierer definiert wurde (schreibt).Slick 2.0: Wie man angehobene Abfrageergebnisse in eine Fallklasse umwandelt?

Hier ist mein Fall Klasse und Begleitobjekt:

package deals.db.interf.slick2 

import scala.slick.driver.MySQLDriver.simple._ 
import play.api.libs.json.Json 

case class PartnerInfo(
    id: Int, 
    name: String, 
    site: String, 
    largeLogo: String, 
    smallLogo: String, 
    publicationSite: String 
) 

object PartnerInfo { 

    def toCaseClass(??) = { // what type are the arguments to be passed? 
    PartnerInfo(fx(??)) // how to transform the input types (slick) to Scala types? 
    } 

    // Notice I'm using slick 2.0.0 RC1 
    class PartnerInfoTable(tag: Tag) extends Table[(Int, String, String, String, String, String)](tag, "PARTNER"){ 
     def id = column[Int]("id") 
     def name = column[String]("name") 
     def site = column[String]("site") 
     def largeLogo = column[String]("large_logo") 
     def smallLogo = column[String]("small_logo") 
     def publicationSite = column[String]("publication_site") 

     def * = (id, name, site, largeLogo, smallLogo, publicationSite) 
    } 


    val partnerInfos = TableQuery[PartnerInfoTable] 


    def qPartnerInfosForPuglisher(publicationSite: String) = { 
    for ( 
     pi <- partnerInfos if (pi.publicationSite == publicationSite) 
    ) yield toCaseClass(_) // Pass all the table columns to toCaseClass() 
    } 


    implicit val partnerInfoWrites = Json.writes[PartnerInfo] 

} 

Was ich nicht bekommen ist, wie die toCaseClass() -Methode zu implementieren, um die Spaltentypen von Slick 2 bis Scala-Typen zu transformieren - beachten Sie die Funktion fx() im Körper von toCaseClass() soll nur darauf hinweisen.

Ich frage mich, ob es möglich ist, den Scala-Typ vom Slick-Spaltentyp zu bekommen, weil es eindeutig in der Tabellendefinition übergeben wird, aber ich finde nicht, wie man es bekommt.

Irgendeine Idee?

Antwort

9

Ich glaube, hier ist die einfachste Methode PartnerInfo im Tabellenschema abzubilden wäre:

class PartnerInfoTable(tag: Tag) extends Table[PartnerInfo](tag, "PARTNER"){ 
     def id = column[Int]("id") 
     def name = column[String]("name") 
     def site = column[String]("site") 
     def largeLogo = column[String]("large_logo") 
     def smallLogo = column[String]("small_logo") 
     def publicationSite = column[String]("publication_site") 

     def * = (id, name, site, largeLogo, smallLogo, publicationSite) <> (PartnerInfo.tupled, PartnerInfo.unapply) 
    } 

val partnerInfos = TableQuery[PartnerInfoTable] 


    def qPartnerInfosForPuglisher(publicationSite: String) = { 
    for ( 
     pi <- partnerInfos if (pi.publicationSite == publicationSite) 
    ) yield pi 
    } 

Ansonsten PartnerInfo.tupled sollte es tun:

def toCaseClass(pi:(Int, String, String, String, String, String)) = PartnerInfo.tupled(pi) 
Verwandte Themen