【发布时间】:2021-07-15 09:44:06
【问题描述】:
我有一个具有字段 filter 的类 ReportTemplate。现在 ReportTemplateRow 是代表 ReportTemplate 的 db 类。我想要的是在 ReportTemplate 中有 JsonAST.JValue 类型的过滤器,但在 ReportTemplateRow 中有 String 类型(当保存在 db 上时)......我希望 ReportTemplate 和 ReportTemplateRow 之间的转换自动发生。
下面的代码可以正常工作,但显然没有任何转换...所以每次我需要在我的代码中使用 ReportTemplate 时,我都必须将 ReportTemplate 显式转换为 ReportTemplateResponse...
我知道我应该覆盖 apply 和 unapply 方法,但我无法弄清楚具体如何...我用不同的关键字搜索了这个问题,但找不到确凿的答案。
case class ReportTemplate(id: Long, reportId: Long, name: String, group : Option[String], filter : String, created : DateTime)
class ReportTemplateRow(tag: Tag) extends Table[ReportTemplate](tag, "ReportTemplate"){
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def reportId = column[Long]("reportId")
def name = column[String]("name")
def group = column[Option[String]]("group")
def filter = column[String]("filter", O.SqlType("text"))
def created = column[DateTime]("created",O.SqlType("timestamp not null default CURRENT_TIMESTAMP"))
def * = (id, reportId, name, group, filter, created) <> (ReportTemplate.tupled, ReportTemplate.unapply)
我期望拥有类似于以下内容的内容:
case class ReportTemplate(id: Long, reportId: Long, name: String, group : Option[String], filter : JsonAST.JValue, created : DateTime)
object ReportTemplate {
def unapply(r: ReportTemplate) : (Long, Long, String, Option[String], String, DateTime) = (r.id, r.name, r.group, JsonAST.compactRender(r.filter), r.created)
def apply(id: Long, reportId: Long, name: String, group : Option[String], filter : String, created : DateTime) : ReportTemplate =
ReportTemplate(id, reportId, name, group, parse(filter), created)
}
class ReportTemplateRow(tag: Tag) extends Table[ReportTemplate](tag, "ReportTemplate"){
def id = column[Long]("id", O.PrimaryKey, O.AutoInc)
def reportId = column[Long]("reportId")
def name = column[String]("name")
def group = column[Option[String]]("group")
def filter = column[String]("filter", O.SqlType("text"))
def created = column[DateTime]("created",O.SqlType("timestamp not null default CURRENT_TIMESTAMP"))
def * = (id, reportId, name, group, filter, created) <> (ReportTemplate.apply, ReportTemplate.unapply)
【问题讨论】: