在Slick

时间:2018-01-18 05:30:41

标签: scala slick

我正在使用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
        )
}

0 个答案:

没有答案