持久密钥

时间:2017-06-16 11:12:07

标签: haskell yesod aeson haskell-persistent

我正在Haskell中构建一个Web应用程序。我正在使用持久库连接到postgresql数据库。

我正在使用标准架构定义文件系统,其中模板Haskell用于从架构生成类型。

share [mkPersist sqlSettings, mkMigrate "migrateAll"]
  $(persistFileWith lowerCaseSettings "schema")

我的架构文件中定义了许多类似于(假例子)的数据类型:

User json
  email Text

Post json
  owner UserId
  name  Text
  body  Text

“Post”旁边的“json”表示框架会自动生成ToJSON / FromJSON。

我一直在为我的许多类型使用这种自动实例生成,以便我可以通过网络对它们进行序列化。

我的问题:我想为Keys提供ToJSON的自定义实例。例如,在上面的“UserId”中将是“关键用户”。每次在“PostId”作为“Key Post”等时自动生成这样的实例

当“发布”被序列化时,它会将“所有者”从一个键转换为索引号,如“52”。

我想将所有数据库键序列化为不同的样式。例如,而不是产生数字'52'而产生字符串“fiftytwo”(仅作为示例)。

如果我没有使用代码生成,我可以做类似的事情

instance ToJSON (Key record) where
  toJSON _ = Data.Aeson.String "placeholder"

但是由于重叠的实例错误,这将不需要使用自动代码生成。也许有一种方法可以告诉代码生成器不要为所有数据类型生成“ToJSON(Key Post)”等实例?

我也可以简单地为每种类型编写自定义实例声明,但这将是非常多余的。

我熟悉使用newtypes来拥有类型类的多个实例,但是这不适合这种情况。

谢谢!

1 个答案:

答案 0 :(得分:0)

根据haoformayor评论中的建议,这个问题现在已经解决了。答案是分叉持久模板库并修改mkKeyTypeDec部分。