持久键的自定义 ToJSON 实例
Custom ToJSON instance for Persistent Key
我正在 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由框架自动生成
我一直在为我的许多类型使用这种自动实例生成,以便我可以通过网络序列化它们。
我的问题:我想为键提供 ToJSON 的自定义实例。例如,上面的 "UserId" 将是 "Key User"。每次都会在 "PostId" 时刻自动为它生成这样一个实例,如 "Key Post" 等等
当 "Post" 被序列化时,它会将 "owner" 从键转换为索引号,例如“52”。
我想将所有数据库键序列化为不同的样式。例如,不是生成数字“52”而是生成字符串 "fiftytwo"(只是一个例子)。
如果我不使用代码生成,我可以做类似
的事情
instance ToJSON (Key record) where
toJSON _ = Data.Aeson.String "placeholder"
但是由于实例重叠错误,这将不需要使用自动代码生成。也许有一种方法可以告诉代码生成器不要为所有数据类型生成 "ToJSON (Key Post)" 等实例?
我也可以简单地为每种类型编写自定义实例声明,但这将是非常多余的。
我熟悉使用新类型来拥有一个类型的多个实例class,但是这不太适合这种情况。
谢谢!
根据haoformayor评论中的建议,该问题现已解决。答案是分叉持久模板库并修改 mkKeyTypeDec
部分。
我正在 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由框架自动生成
我一直在为我的许多类型使用这种自动实例生成,以便我可以通过网络序列化它们。
我的问题:我想为键提供 ToJSON 的自定义实例。例如,上面的 "UserId" 将是 "Key User"。每次都会在 "PostId" 时刻自动为它生成这样一个实例,如 "Key Post" 等等
当 "Post" 被序列化时,它会将 "owner" 从键转换为索引号,例如“52”。
我想将所有数据库键序列化为不同的样式。例如,不是生成数字“52”而是生成字符串 "fiftytwo"(只是一个例子)。
如果我不使用代码生成,我可以做类似
的事情instance ToJSON (Key record) where
toJSON _ = Data.Aeson.String "placeholder"
但是由于实例重叠错误,这将不需要使用自动代码生成。也许有一种方法可以告诉代码生成器不要为所有数据类型生成 "ToJSON (Key Post)" 等实例?
我也可以简单地为每种类型编写自定义实例声明,但这将是非常多余的。
我熟悉使用新类型来拥有一个类型的多个实例class,但是这不太适合这种情况。
谢谢!
根据haoformayor评论中的建议,该问题现已解决。答案是分叉持久模板库并修改 mkKeyTypeDec
部分。