Обновите строки Scala Slick с необязательными столбцами

У меня есть Slick Table с несколькими столбцами, и я хочу обновить некоторые из этих столбцов на основе пользовательского ввода. Моя таблица выглядит так:

class Users(_tableTag: Tag) extends Table[User](_tableTag, "users") {
  def * = (id, name, email, phone, passwordHash, createdAt) <> (User.tupled, User.unapply)

  val id: Rep[Long] = column[Long]("id", O.AutoInc, O.PrimaryKey)
  val name: Rep[String] = column[String]("name")
  val email: Rep[String] = column[String]("email")
  val phone: Rep[String] = column[String]("phone")
  val passwordHash: Rep[String] = column[String]("password_hash")
  val createdAt: Rep[java.sql.Timestamp] = column[java.sql.Timestamp]
      ("created_at", SqlType("TIMESTAMP NOT NULL DEFAULT current_timestamp"))
}

Класс case User выглядит следующим образом:

case class User(
  id: Long,
  name: String,
  email: String,
  phone: String,
  passwordHash: String,
  createdAt: Timestamp) 

Я использую slick с Play, поэтому я решил создать класс случая обновления на основе предоставленных пользователем необязательных полей json, например:

case class UserUpdate(
  id: Long,
  name: Option[String],
  email: Option[String],
  phone: Option[String],
  passwordHash: Option[String])

Как я могу сделать гладкий запрос 3.1, который обновляет поля типа Some(value) в этом объекте обновления?


person Jacob Lyles    schedule 11.04.2017    source источник
comment
Вы можете получить старую запись oldUser: User и сделать UserUpdate.field.getOrElse(oldUser.field)   -  person insan-e    schedule 11.04.2017
comment
@insan-e да, это сработает, но потребуется 2 запроса (выбор, а затем обновление). Я хотел бы сделать это в одном запросе на обновление.   -  person Jacob Lyles    schedule 11.04.2017


Ответы (1)


Как предложил @insan-e, вы можете получить existingUser с помощью userUpdate.id и обновить с помощью existingUser.field.getOrElse(existingUser.field).

Прямо сейчас это невозможно сделать в одном запросе на обновление, используя slick API, это известная проблема

person Chetan Kumar Meena    schedule 12.04.2017
comment
Похоже, это лучший способ, доступный на данный момент. - person Jacob Lyles; 12.04.2017