Scala检查2个对象之间的差异

时间:2015-09-03 08:53:53

标签: scala playframework

我正在使用mysql构建一个play scala应用程序。并且需要实现表的历史记录。我的想法是记录某些表上记录的所有更改。因此,如果客户端有更新,app将检查数据库上的当前值和用户的新数据。 并且只会在历史表上输入不同的内容。 示例:id,name,address,...

如果用户发送新数据且只发送修改过的名称列,我只会输入旧值和新值的名称历史记录。

目前我使用if逐一手动检查它,当我在桌面上有更多列时,这会使我的代码更多。

我的问题是,有没有什么好方法可以检查不同的,而不是逐个使用if?

进行比较

这是我的应用程序上的代码示例(如果有,我可以看到我使用4,并且我将有另一个包含更多列的表):

Motor.findById(motorEdit.id) match {
  case Some(motor) => {
    val hisText = ArrayBuffer.empty[String]
    val hisMsg: (String, String) => String = {
      (Messages.get("mtr_his_upt") + " \"" + _ + "\" -> \"" + _ + "\"")
    }
    if(motor.name.compareTo(motorEdit.name) != 0)
      hisText += hisMsg(motor.name, motorEdit.name)
    if(motor.types.compareTo(motorEdit.types) != 0)
      hisText += hisMsg(motor.types, motorEdit.types)
    if(motor.code.getOrElse("").compareTo(motorEdit.code.getOrElse("")) != 0)
      hisText += hisMsg(motor.code.getOrElse(""), motorEdit.code.getOrElse(""))
    if(motor.visible != motorEdit.visible)
      hisText += hisMsg(motor.visible.toString, motorEdit.visible.toString)

    val updateNumber = motor.updateNumber + 1
    Motor.updateById(motor.id).withAttributes(
      'name -> motorEdit.name,
      'types -> motorEdit.types,
      'code -> motorEdit.code,
      'visible -> motorEdit.visible,
      'update_number -> updateNumber)

    hisText.map { value =>
      MotorHistory.createWithAttributes(
        'user_id -> currentUser.id,
        'motor_id -> motor.id,
        'history -> value,
        'update_number -> updateNumber
      )
    }
    retOk
  }
  case None => retNotFound
}

也许我会解释为什么我使用设计历史表是因为我有一些表需要加入2个以上的表,但我想将历史记录保存在1个表中。

2 个答案:

答案 0 :(得分:0)

在我看来,存储数据库历史记录的最佳方法是为每个表创建单独的历史记录。因此,如果你有用户表,你必须创建额外的表,让我们说user_hist。对我来说,您可以更好地查看所有列,您可以更轻松地查看更改内容。如果您使用ORM,您可以编写自己的等于编译这些对象(当然是在模型中)

答案 1 :(得分:-1)

如果对象是case class,那么默认情况下会有equals运算符。

case class User(name: String, address: String)

val A = User("Bob", "1 Green Street")

val B = User("Bob", "1 Green Street")

A == B
>true

如果您无法使用案例类,则必须在课程中重新定义equalshashCode以满足您的需求。