Scala 不发送并指定模型字段的值
我在Play应用程序中使用了一个类作为模型:Scala 不发送并指定模型字段的值,scala,playframework,anorm,Scala,Playframework,Anorm,我在Play应用程序中使用了一个类作为模型: case Class1( id: Pk[UUID] = NotAssigned, addedAt: DateTime = null ) object Class1 { //.... } 在处添加的字段在db中有一个默认值now(),在db中不能为NULL。但是,尽管如此,当我想创建Class1的实例时,我必须指定它,即使我不想将其发送到db,因为它将在db中设置为now(): Class1(addedAt = DateTime.now
case Class1(
id: Pk[UUID] = NotAssigned,
addedAt: DateTime = null
)
object Class1 {
//....
}
在处添加的字段在db中有一个默认值now()
,在db中不能为NULL
。但是,尽管如此,当我想创建Class1的实例时,我必须指定它,即使我不想将其发送到db,因为它将在db中设置为now()
:
Class1(addedAt = DateTime.now())
使用null
作为默认值似乎不是一个明智的想法,使用选项[DateTime]=None
没有意义,因为它在db中不能为null。
我该怎么办:我希望它存在于
Class1
中,因为它存在于db中,但同时我不想指定它,因为它不需要 初始化与未初始化绝对是对选项
值的一种有效理解,并不强迫您推断事物在何处初始化
在这种情况下,如果希望避免误解,只需将该值重命名为addedToDb
——或者如果不选择重命名,则使用等效的文档注释即可
我认为对于一个尚未添加到数据库中的对象,addedToDb
为None
,任何人都不会有问题
还有。。。不要使用
null
,这是邪恶的假设您刚刚创建了此类的对象,但尚未将其发送到数据库。(新类别1.addedAt)的结果是什么?您需要不被分配的概念,与id
相同。因为它不是主键,所以通常的表达方式是选项
。如果您可以确保始终使用已发送到数据库访问层之外的数据库的对象,则在DAL中保留选项[DateTime]
,但不要直接在程序中不需要处理未分配对象的部分使用:
case class Class1DAL(..., addedAt: Option[DateTime])
// must ensure it is never seen with x not sent to DB
class Class1(x: Class1DAL) {
def id = x.id
def addedAt: DateTime =
x.addedAt.getOrElse(throw new IllegalStateException("Class1.addedAt unassigned, which should be impossible")
}
但您是否忘记了将值从db解析到我的模型?在db中,它被称为“addedAt”,它没有选项[DateTime]的类型,因为它总是存在(在db中不能为null)。仅当db中的值可为null时,我们才使用Option。