2016-12-28 74 views
4

创建通用的更新功能,我有这样的温控功能:的油滑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) 
    } 
    } 

但是,这并不编译。有人可以协助吗?

回答

2

它几乎不错。有了这样低于它应该工作的小变化:

// 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导入)。对于您自定义类型,您需要使用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 
+0

解决了这个问题。谢谢! –