определение ссылки «многие к одному» в классе case Slick

Другой вопрос отвечает на вопрос, как определить ассоциацию "один ко многим", определив метод в классе "один" (Directorate) который возвращает Seq класса «многие» (ServiceArea). Но это не касается «двунаправленной» части вопроса.

Используя этот пример, я хотел бы увидеть, как пройти ассоциацию с другого направления. Вместо

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

Я хотел бы увидеть

case class ServiceArea(areaCode: String, directorate: Directorate, name: String)

Возможно ли это со Сликом? Потому что, когда я пытаюсь что-то вроде

object ServiceAreas ...
  def * = areaCode ~ directorate ~ name <> (ServiceArea, ServiceArea.unapply _)

он не компилируется, не находит неявное значение для параметра доказательства типа TypeMapper[ForeignKeyQuery[ServiceAreas,ServiceArea]].


person Mike    schedule 06.05.2013    source источник
comment
это мой ответ? Slick не является ORM?   -  person Mike    schedule 06.05.2013


Ответы (1)


Вы должны немного скорректировать свой образ мышления. Slick обрабатывает состав и выполнение запросов, но, как вы упомянули в своем комментарии, это не ORM (слава богу).

Посмотрите на код, на который вы ссылались:

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 _)
}

Ссылка на directorate уже определена внешним ключом для навигации.

Итак, теперь вы можете написать такой запрос:

   def directorates = for {
    area <- Parameters[String]
    sa <- ServiceAreas if sa.areaCode === area
    dir <- sa.directorate
  } yield dir

Что даст директорию для каждого матча.

person Jack    schedule 11.06.2013