对于Slick模型,Case类可选但必需字段

时间:2014-06-11 19:35:57

标签: scala slick

这可能有点鸡和鸡蛋的问题,但这是情况,我想听听你的意见。

有一个简单的case class例如

case class Person(id:Option[Int],firstName:Option[String] ...)

现在Slick Table类看起来如下

class Person(tag: Tag) extends Table[Person](tag, "person") {
def * = (id?, firstName) <> ((Person.apply _).tupled, Person.unapply)

def id = column[Int]("id", O.AutoInc, O.PrimaryKey)

现在idOption被定义为case class的原因是因为在应用中的其他位置使用了相同的Person类。例如序列化/反序列化控制器层中的JSON。显然,当请求进入创建新记录时,id将不会在传入的JSON中传递。同时,Option id id在尝试从案例类中检索Option值时可能会产生误导,因为这不是一个可选字段。我看到None类型的IMO我认为这可能有SomeOption,但在这种情况下,始终有一个值,来自Slick / db,因此将其定义为case class Person(id : SOME_CONST_NUM, firstName :Option[String] ..)具有误导性。

我可以将其定义为Person,因此无论何时将其传递给Slick进行插入,Slick都会插入一个PK值。从您总是Person.id的{​​{1}}中检索数据并获取Slick为您提供的价值。用法明智,这是明确和更合适的。但是,拥有这个硬编码的默认值SOME_CONST_NUM是丑陋的并且代码闻起来。

在这种情况下,您如何定义id字段?

0 个答案:

没有答案