1

この質問は、前の質問に関連しています。しかし、その質問はクローズされているので、別の質問を作成する必要があります。使用例は次のとおりです。5 列のテーブルがあります。レコードを作成する場合、必要な列は 2 つだけです。後で、ユーザーは同じレコードにさらに情報を追加します。たとえば、次の構造を持つユーザー テーブルです。電話 | 電子メール | クレジット | レベル。ユーザーが登録するとき、必要なのはメールアドレスだけです。ユーザーは、ID と電子メールで作成されます。後で、ユーザーが電話番号、クレジットを追加したい場合、このユーザーが十分なクレジットを持っている場合、システムもレベルを更新します。私は

case class User(id:UUID, phone:Option[String], email:Option[String], 
    credit:Option[Double], level:Option[String]

私も持っています

sealed class Users extends CassandraTable[Users, User] {
    object id extends UUIDColumn(this) with PartitionKey[UUID]

    object phone extends OptionalStringColumn(this)

    object email extends OptionalStringColumn(this)

    object credit extends OptionalDoubleColumn(this)

    object level extends OptionalStringColumn(this)

    def fromRow(row: Row): User = {
        User(id(row), phone(row), email(row), credit(row), level(row))
    }
}

オプションの列を正しく使用していますか? ユーザーが 1 つ以上の特定の列を更新しているユース ケースでは、どのように進めればよいですか? こんなアップデート方法を試してみました

def updateUser(u: User): Future[ResultSet] = {
    update.where(_.id eqs u.id).modify(_.phone setTo u.phone)
      .and(_.email setTo u.email)
      .and(_.credit setTo u.credit)
      .and(_.level setTo u.level)
      .consistencyLevel_=(ConsistencyLevel.QUORUM)
      .future()
  }

ID からテーブルを読み取り、既存の列の値を使用してユーザー オブジェクトを作成し、新しい値を追加してからレコードを更新する必要があるため、この方法はうまく機能しません。updateメソッドに条件をたくさん書くのも現実的ではありません。多数の列があり、各列を個別に更新できる場合、可能な値の組み合わせの膨大なリストを作成する必要があります。次の方法が機能する場合があります。

    if(u.phone != None) update.where(_.id eqs u.id).modify(_.phone setTo u.phone).future
    if(u.email != None) update.where(_.id eqs u.id).modify(_.email setTo u.email).future
    if(u.credit != None) update.where(_.id eqs u.id).modify(_.credit setTo u.credit).future
    ......

しかし、更新のたびに更新の失敗を処理したい場合は悪夢になるので、それが良い習慣であるかどうかはわかりません。オプションの列を使用して、必要なものを達成するにはどうすればよいですか?

4

2 に答える 2