我刚开始使用Persistent from Yesod并且已经遇到了我的第一个障碍。
share [mkPersist sqlSettings, mkMigrate "migrateAll"] [persistLowerCase|
User
email String
createdAt UTCTime Maybe default=CURRENT_TIME
updatedAt UTCTime Maybe default=CURRENT_TIME
deriving Show
|]
u <- insert $ User "saurabhnanda@gmail.com" Nothing Nothing
我来自Rails背景,并且喜欢他们提倡的架构设计惯例。在这种特殊情况下,每个表都有created_at
和updated_at
时间戳。但是,有没有办法不为每个要创建的对象指定createdAt
和updatedAt
字段?
答案 0 :(得分:1)
我对Persistent知之甚少,但通常的技术是定义一些参数化类型。例如,您可以编写
data Dated a = Dated
{ created :: UTCTime
, updated :: UTCTime
, value :: a
}
然后您的裸值不必担心其元数据,并且可以跨所有不同类型统一处理元数据。例如您可能会公开这样的API:
new :: a -> IO (Dated a)
new a = do
now <- getUTCTime
return (Dated now now a)
update :: Dated a -> a -> IO (Dated a)
update old new = do
now <- getUTCTime
return (old { updated = now, value = new })
然后我建议导出Dated
类型构造函数及其所有字段,以及new
和update
,但不导出Dated
数据构造函数。这样可以确保正确维护created
和updated
字段。