我的数据库中的每张表格都需要有一个created_at
和updated_at
字段用于一般卫生和家务管理。这导致持久性模型看起来是这样的:如何处理记录类型中的“内务”字段?
User
email String Maybe
name String Maybe
tgramUserId TgramUserId Maybe
createdAt UTCTime
updatedAt UTCTime
deriving Show
现在,我有用于创建用户的一串的API,根据不同的业务情况。例如:
- createUserFromWebForm
- createUserFromTelegram
- createUserFromOAuth
我想每个API的类型的签名是:
createUserFromX :: User -> SqlPersistM (Entity User)
然而,这意味着每个呼叫站点createUserFromX
需要拨打getCurrentTime
并设置createdAt
和updatedAt
管家字段。在这些API中本地化这种复杂性的方法是什么?
一个不洁(IMO)的解决方案是将签名改为:
createUserFromTelegram :: Maybe TgramUserId -> SqlPersistM (Entity User)
...但是,违背了摆在首位使用记录类型的目的(在这个特殊的例子,你可能支持这种方法,但如果记录类型有10个字段会怎么样)?
您的所有功能处理'User'它应该要简单地重构一个像'updateTimes :: User - > IO User'这样的函数并使用它 - 如果你想为'User'做更多的事情,那么你可能想为这个引入一些类型类 – Carsten