为 Slick 3.1.1 创建通用更新函数
Creating generic update function for Slick 3.1.1
我有这个功能:
def updateInvoiceAdminStatusField(id: Int, newAdminStatus: AdminStatus): Future[Int] = {
db.run {
val adminStatus: Query[Rep[AdminStatus], AdminStatus, Seq] = InvoicesTable.filter(invoice => invoice.id === id).map(invoice => invoice.status)
adminStatus.update(newAdminStatus)
}
}
我想过让它通用:
def updateInvoiceField[T](id: Int, fieldExtractor: (Invoices) => Rep[T], newValue: T): Future[Int] = {
db.run {
val adminStatus = InvoicesTable.filter(invoice => invoice.id === id).map(invoice => {
fieldExtractor(invoice)
})
adminStatus.update(newValue)
}
}
但这不编译。有人可以帮忙吗?
差不多好了。像下面这样的小改动应该可以工作:
// I added below T: ColumnType
def updateInvoiceField[T: ColumnType](id: Int, fieldExtractor: (Invoices) => Rep[T], newValue: T): Future[Int] = {
db.run {
val adminStatus = InvoicesTable.filter(invoice => invoice.id === id).map(invoice => {
fieldExtractor(invoice)
})
adminStatus.update(newValue)
}
}
注意我添加了这个 : ColumnType
这基本上意味着你需要在范围内有适当的隐式 - 特别是那个会转换 T
=> ColumnType[T]
的范围。那只是因为否则 T
可以是任何东西,而 Slick
将无法弄清楚如何转换它。
所以对于 String
、Int
等事情,您显然已经有了适当的对话(从 api
导入 profile/driver)。对于您的自定义类型,您需要使用 MappedColumnType
来提供正确的转换。下面的示例(类型安全 ID):
implicit def columnType[T]: BaseColumnType[Id[T]] =
MappedColumnType.base[Id[T], Long](toLong, fromLong)
private def fromLong[T](dbId: Long): Id[T] = Id(dbId)
private def toLong[T](id: Id[T]): Long = id.value
我有这个功能:
def updateInvoiceAdminStatusField(id: Int, newAdminStatus: AdminStatus): Future[Int] = {
db.run {
val adminStatus: Query[Rep[AdminStatus], AdminStatus, Seq] = InvoicesTable.filter(invoice => invoice.id === id).map(invoice => invoice.status)
adminStatus.update(newAdminStatus)
}
}
我想过让它通用:
def updateInvoiceField[T](id: Int, fieldExtractor: (Invoices) => Rep[T], newValue: T): Future[Int] = {
db.run {
val adminStatus = InvoicesTable.filter(invoice => invoice.id === id).map(invoice => {
fieldExtractor(invoice)
})
adminStatus.update(newValue)
}
}
但这不编译。有人可以帮忙吗?
差不多好了。像下面这样的小改动应该可以工作:
// I added below T: ColumnType
def updateInvoiceField[T: ColumnType](id: Int, fieldExtractor: (Invoices) => Rep[T], newValue: T): Future[Int] = {
db.run {
val adminStatus = InvoicesTable.filter(invoice => invoice.id === id).map(invoice => {
fieldExtractor(invoice)
})
adminStatus.update(newValue)
}
}
注意我添加了这个 : ColumnType
这基本上意味着你需要在范围内有适当的隐式 - 特别是那个会转换 T
=> ColumnType[T]
的范围。那只是因为否则 T
可以是任何东西,而 Slick
将无法弄清楚如何转换它。
所以对于 String
、Int
等事情,您显然已经有了适当的对话(从 api
导入 profile/driver)。对于您的自定义类型,您需要使用 MappedColumnType
来提供正确的转换。下面的示例(类型安全 ID):
implicit def columnType[T]: BaseColumnType[Id[T]] =
MappedColumnType.base[Id[T], Long](toLong, fromLong)
private def fromLong[T](dbId: Long): Id[T] = Id(dbId)
private def toLong[T](id: Id[T]): Long = id.value