如何省略将由数据库填写的字段

时间:2016-02-05 15:48:25

标签: haskell yesod

我刚开始使用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_atupdated_at时间戳。但是,有没有办法不为每个要创建的对象指定createdAtupdatedAt字段?

1 个答案:

答案 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类型构造函数及其所有字段,以及newupdate,但不导出Dated数据构造函数。这样可以确保正确维护createdupdated字段。