2016-12-09 4 views
0

Я довольно привык к написанию стандартного кода плитки с косой пластинкой, как это.Создание единой таблицы столбцов с помощью Slick

Предположим, что я создаю таблицу под названием Foo с идентификаторами и именами столбцов. Мы можем написать

case class Foo(id: Long, name: String) 
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") { 
    def id = column[Long]("id") 
    def name = column[String]("name") 
    def * = (id, name) <> (Foo.tupled, Foo.unapply) 
} 

А что, если мне нужна таблица с одним столбцом, где Foo просто имеет имя. Код ниже не компилируется, потому что теперь у Foo больше нет корневого метода.

case class Foo(name: String) 
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") { 
    def name = column[String]("name") 
    def * = (name) <> (Foo.tupled, Foo.unapply) 
} 

Я нашел эту тему на SO

Scala projections in Slick for only one column

и изменил код для

case class Foo(name: String) 
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") { 
    def name = column[String]("email_address") 
    def * = (name) 
} 

, но до сих пор не компилирует

ответ

2

Я считаю, что предыдущие ответы уже решить эту конкретную проблему. Я думаю, однако есть одна вещь, которую стоит добавить здесь.

Там нет ничего Слик, что требует использования case classes как unpacked type (unpacked type будучи своего рода модели, в этом случае Foo).

В вашей проекции здесь:

def * = (id, name) <> (Foo.tupled, Foo.unapply) 

можно передать любые две функции, которые вы хотите, при условии, что:

  • первый будет создавать unpacked type из-за кортежа (2+ столбцов в проекция) или значение (проекция в 1 колонке)

  • второй может создать кортеж (опять же в случае столбцов 2+ в проекции) или
    значение (1 проекция столбца).

Это только удобно, что case classes имеют такие методы, сгенерированные из коробки (tupled, apply, unapply).

Надеюсь, это разъяснит, что даже если вам не хватает таких методов, всегда возможно (в худшем случае), например, создайте свои функции, которые отвечали бы заданным требованиям.

2

Использование Foo.apply _ в случае одного параметр. Ваш код будет следующим

case class Foo(name: String) 

final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") { 
    def name = column[String]("name") 
    def * = (name) <> ((Foo.apply _), Foo.unapply) 
} 

Объяснение:

scala> case class Foo(name: String) 
defined class Foo 

scala> Foo.apply _ 
res0: String => Foo = <function1> 

В случае одного параметра случае класса Foo.apply _ возвращает function1, который является то, что требуется.

Но в случае более чем одного параметра это невозможно, поэтому ожидается .tupled.

0

Найдено еще один ответ, а

case class Foo(name: String) 
final class FooTable(tag: Tag) extends Table[Foo](tag, "foo") { 
    def name = column[String]("name") 
    def * = name <> (Foo, Foo.unapply) 
} 
Смежные вопросы