我正在使用Slick编写CRUD应用程序,我希望我的更新查询只更新一组特定的列,并使用.map().update()
。
我有一个函数返回一个字段元组,可以在我的表定义(def writableFields
)中更新。我有一个函数,它返回一个值元组,用于从case类中提取。
它工作正常,但创建一个repo并为每个表编写整个update
函数很烦人。我想创建一个这个函数的泛型形式,并使我的表和它的伴随对象扩展一些特征。但我无法提出正确的类型定义。
Slick期望map()
的输出与update
的输出在某种程度上兼容。而且我不知道如何为元组制作通用类型。
甚至可以完成吗?或者是否有另一种限制代码重复的方法?理想情况下,我想避免编写Repos,只需实例化泛型类或调用泛型方法。
object ProjectsRepo extends BaseRepository[Projects, Project] {
protected val query = lifted.TableQuery[Projects]
def update(id: Long, c: Project): Future[Option[Project]] = {
val q = filterByIdQuery(id).map(_.writableFields)
.update(Projects.mapFormToTable(c))
(db run q).flatMap(
affected =>
if (affected > 0) {
findOneById(id)
} else {
Future(None)
}
)
}
}
class Projects(tag: Tag) extends Table[Project](tag, "projects") with IdentifiableTable[Long] {
val id = column[Long]("id", O.PrimaryKey, O.AutoInc)
val title = column[String]("title")
val slug = column[String]("slug")
val created_at = column[Timestamp]("created_at")
val updated_at = column[Timestamp]("updated_at")
def writableFields =
(
title,
slug
)
def readableFields =
(
id,
created_at,
updated_at
)
def allFields = writableFields ++ readableFields // shapeless
def * = allFields <> (Projects.mapFromTable, (_: Project) => None)
}
object Projects {
def mapFormToTable(c: Project): FormFields =
(
c.title,
c.slug
)
}