我正在使用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个表中。
答案 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
如果您无法使用案例类,则必须在课程中重新定义equals
和hashCode
以满足您的需求。