这是表示整行的案例类:
case class CustomerRow(id: Long, name: String, 20 other fields ...)
我有一个形状案例类,它只“暴露”一个列的子集,并在用户创建/更新客户时使用:
case class CustomerForm(name: String, subset of all fields ...)
我可以使用CustomerForm
进行更新。但是我不能用它来插入。 CustomerForm
中有一些列不是必需的(非空),只能由服务器提供。我现在所做的是从CustomerRow
创建CustomerForm
:
def form2row(form: CustomerForm, id: Long, serverOnlyValue: Long, etc...) = CustomerRow(
id = id,
serverOnlyColumn = serverOnlyValue,
name = form.name.
// and so on for 20 more tedious lines of code
)
并将其用于插入。
有没有办法在光滑中组合插入,这样我就可以删除那个乏味的form2row
函数?
类似的东西:
(customers.map(formShape) += form) andAlsoOnTheSameRow .map(c => (c.id, c.serverOnlyColumn)) += (id, someValue)
答案 0 :(得分:1)
是的,您可以这样做:
case class Person(name: String, email: String, address: String, id: Option[Int] = None)
case class NameAndAddress(name: String,address: String)
class PersonTable(tag: Tag) extends Table[Person](tag, "person") {
val id = column[Int]("id", O.PrimaryKey, O.AutoInc)
val name = column[String]("name")
val email = column[String]("email")
val address = column[String]("address")
//for partial insert
def nameWithAddress = (name, address)<>(NameAndAddress.tupled, NameAndAddress.unapply)
def * = (name, email, address, id.?) <> (Person.tupled, Person.unapply)
}
val personTableQuery = TableQuery[PersonTable]
// insert partial fields
personTableQuery.map(_.nameWithAddress) += NameAndAddress("abc", "xyz")
确保,您知道可以为空的字段,它们应该是Option [T]的形式,其中T是归档类型。在我的示例中,电子邮件应该是Option [String]而不是String。