Где я могу определить методы, которые будут вызываться в таблицах?

(Я полный новичок в Scala и Slick, поэтому любой обзор кода приветствуется)

У меня определены следующие class и Slick Table:

case class Foo(title: String, description: String, id: Int = 0)

class FooTable(tag: Tag) extends Table[Foo](tag, "FOO") {

  def id = column[Int]("ID", O.PrimaryKey, O.AutoInc)
  def title = column[String]("TITLE", O.NotNull)
  def description = column[String]("DESCRIPTION")

  def * = (title, description, id) <> (Foo.tupled, Foo.unapply)
}

Я хочу добавить метод, который будет возвращать List из Foo, соответствующих указанному title. Что-то вроде этого:

def findByTitle(title: String) = DB.withSession { implicit s: Session =>
  <FooTable TableQuery>.filter(_.title === title)
}

Тогда я смогу использовать такой метод:

val foos = TableQuery[FooTable]
DB.withSession { implicit s: Session =>
  val anId = foos.findByTitle("bar")
}

Как / где я могу добавить метод, который может воздействовать на TableQuery для определенного Table? Это вообще правильный способ оформления моего заявления?


person sam-w    schedule 08.07.2014    source источник


Ответы (2)


implicit class FooTableExtensions(q: Query[FooTable,Foo]){
  def findByTitle(t: String) = q.filter(_.title === t)
}

foos.findByTitle("Bar")

См. Обсуждение Scala eXchange 2013 на нашем веб-сайте.

Однако для предварительно скомпилированных запросов может быть полезно иметь DAO, где вы можете кэшировать предварительно скомпилированный запрос. См. Обсуждение Scala Days 2013. Однако с тех пор синтаксис изменился. Проверьте руководство для Compiled.

person cvogt    schedule 08.07.2014
comment
Спасибо, в этом есть смысл! Re: Scala Days 2013, вы имели в виду разговор Slick vs ORM? - person sam-w; 09.07.2014
comment
Моя архитектура развивалась благодаря советам из разных источников по использованию DAO. Теперь я пытаюсь решить ту же проблему в другой среде: stackoverflow.com/questions/24669616/. Буду признателен за вашу помощь, если у вас будет время! - person sam-w; 10.07.2014

Я думаю, что вы хотите ввести DAO (объект доступа к данным), в зависимости от ваших потребностей вы можете позволить сопутствующему объекту класса FooTable быть DAO, который позволит вам вызывать FooTable.findByTitle() из остальной части вашей кодовой базы.

person johanandren    schedule 08.07.2014
comment
Спасибо за внимание к DAO - я вижу много преимуществ в их использовании. - person sam-w; 09.07.2014
comment
Моя архитектура развивалась благодаря советам из разных источников по использованию DAO. Теперь я пытаюсь решить ту же проблему в другой среде: stackoverflow.com/questions/24669616/. Буду признателен за вашу помощь, если у вас будет время! - person sam-w; 10.07.2014