我很习惯这样编写标准的光滑锅炉板代码。
假设我正在创建一个名为Foo的表,其中包含列id和名称。我们可以写
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只有一个名字的列表,该怎么办?下面的代码无法编译,因为Now Foo不再具有tupled方法。
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)
}
但仍然没有编译
答案 0 :(得分: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 _
,则返回一个所需的函数。
但是如果有多个参数,则无法进行此操作,因此需要进行.tupled
。
答案 1 :(得分:2)
我相信以前的答案已经解决了这个特殊问题。不过我觉得有一点值得补充。
Slick中没有任何内容要求您将case classes
用作unpacked type
(unpacked type
作为您的模型,在这种情况下{{1 }})。
在您的预测中:
Foo
你可以传递你想要的任何两个函数:
第一个将创建你的def * = (id, name) <> (Foo.tupled, Foo.unapply)
元组(投影中的2 +列)或值(1列投影)
第二个会创建元组(在投影中为2 +列的情况下再次)或
值(1列投影)。
unpacked type
开箱即用(case classes
,tupled
,apply
)生成此类方法非常方便。
我希望这可以澄清,即使你缺乏这样的方法,也总是可能(在最坏的情况下),例如创建满足特定要求的功能。
答案 2 :(得分: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)
}