2013-02-05 59 views
15

Tôi đang sử dụng SLICK 1.0.0-RC2. Tôi đã xác định hai bảng sau cục và ServiceArea nơi cục có một đến nhiều mối quan hệ với ServiceAreaSLICK Cách xác định mối quan hệ một-nhiều chiều hai chiều để sử dụng trong trường hợp lớp

case class Directorate(dirCode: String, name: String) 

object Directorates extends Table[Directorate]("DIRECTORATES") { 

    def dirCode = column[String]("DIRECTORATE_CODE", O.PrimaryKey) 

    def name = column[String]("NAME") 

    def * = dirCode ~ name <> (Directorate, Directorate.unapply _) 
} 

case class ServiceArea(areaCode: String, dirCode: String, name: String) 

object ServiceAreas extends Table[ServiceArea]("SERVICE_AREAS") { 

    def areaCode = column[String]("AREAE_CODE", O.PrimaryKey) 

    def dirCode = column[String]("DIRECTORATE_CODE") 

    def name = column[String]("NAME") 

    def directorate = foreignKey("DIR_FK", dirCode, Directorates)(_.dirCode) 

    def * = areaCode ~ dirCode ~ name <> (ServiceArea, ServiceArea.unapply _) 
} 

Để thực hiện các trường hợp lớp cục dùng theo hình thức ứng dụng Play của tôi, tôi đang cố gắng để xác định lại các trường hợp lớp cục có a Seq của ServiceAreas có liên quan đến Giám đốc đó.

case class Directorate(dirCode: String, name: String, serviceAreas: Seq[ServiceArea]) 

Vấn đề của tôi bây giờ là với chiếu bảng của Ban giám đốc. Tôi đã cố gắng để tạo ra một phương pháp trong Ban giám đốc:

def serviceAreas = (for { a <- ServiceAreas 
         if (a.dirCode === dirCode) 
        } yield (a)).list map { 
         case t: ServiceArea => t 
        } 

vì vậy mà tôi có thể thử một cái gì đó giống như

def * = dirCode ~ name ~ serviceAreas <> (Directorate, Directorate.unapply _) 

nhưng điều này không thể không làm việc như serviceAreas chỉ đi một chiều.

Có vẻ hợp lý với tôi rằng đối với lớp trường hợp là một đối tượng miền hữu ích nên nó có thể chứa ServiceAreas liên quan.

Tôi tự hỏi làm thế nào tôi nên đi qua các mối quan hệ nghịch đảo để chiếu bảng giám đốc sẽ làm việc.

Trả lời

15

tôi chắc chắn rằng có một giải pháp thanh lịch hơn, nhưng điều này sẽ làm các trick:

import scala.slick.driver.H2Driver.simple._ 
import Database.threadLocalSession 

object SlickExperiments2 { 

    Database.forURL("jdbc:h2:mem:test1", driver = "org.h2.Driver") withSession { 

    (Directorates.ddl ++ ServiceAreas.ddl).create 

    case class Directorate(dirCode: String, name: String) { 
     def serviceAreas: Seq[ServiceArea] = (for { 
     a <- ServiceAreas 
     if (a.dirCode === dirCode) 
     } yield (a)).list 
    } 

    object Directorates extends Table[Directorate]("DIRECTORATES") { 

     def dirCode = column[String]("DIRECTORATE_CODE", O.PrimaryKey) 

     def name = column[String]("NAME") 

     def * = dirCode ~ name <> (Directorate, Directorate.unapply _) 
    } 

    case class ServiceArea(areaCode: String, dirCode: String, name: String) 

    object ServiceAreas extends Table[ServiceArea]("SERVICE_AREAS") { 

     def areaCode = column[String]("AREAE_CODE", O.PrimaryKey) 

     def dirCode = column[String]("DIRECTORATE_CODE") 

     def name = column[String]("NAME") 

     def directorate = foreignKey("DIR_FK", dirCode, Directorates)(_.dirCode) 

     def * = areaCode ~ dirCode ~ name <> (ServiceArea, ServiceArea.unapply _) 
    } 

    Directorates.insert(Directorate("Dircode", "Dirname")) 

    ServiceAreas.insertAll(ServiceArea("a", "Dircode", "A"), ServiceArea("b", "Dircode", "B")) 

    val sa = (for{ 
    d <- Directorates 
    } yield d).list map { case t: Directorate => t.serviceAreas} 

    println(sa) 
    }            
//> List(List(ServiceArea(a,Dircode,A), ServiceArea(b,Dircode,B))) 
} 
+1

Nhờ có ý nghĩa hơn rất nhiều để thêm phương pháp serviceAreas đến lớp hợp cụ thể. Nó có vẻ là cách để đi qua mặt nghịch đảo của một mối quan hệ một-nhiều. –

+0

Rất tuyệt! Tôi không xem xét cách tiếp cận này. Nhưng đối với tôi, việc xây dựng ServiceArea trong lớp Caseate ('case t: ServiceArea => ServiceArea (t.areaCode, t.dirCode, t.name)') sorta smells. Có cách nào để tận dụng ánh xạ xây dựng đã tồn tại trên 'ServiceAreas' không? –

+0

@JonathanWilson Cũng phát hiện ra - rằng bit mã là tàn dư của một cắt và dán. Đối với các khóa được tạo tự động, đôi khi tôi phải tạo các lớp không có ID và dòng đó có thể đến từ một địa điểm như vậy. Cảm ơn - Tôi đã xóa nó ;-) – Jack

Các vấn đề liên quan