gpt4 book ai didi

haskell - 如何在 Yesod 中为外键定义应用表单上的字段?

转载 作者:行者123 更新时间:2023-12-02 21:14:04 24 4
gpt4 key购买 nike

如果我们在模型文件中定义了 2 个简单对象,例如:-

Person
name Text
Age Int
Book
title Text
author Text

我们可以将 Book 的应用形式定义为:-

addBookForm = renderDivs $ Book
<$> areq textField "title" Nothing
<*> areq textField "author" Nothing

但是,如果我们想将作者从文本字段更改为人员 ID,如下所示:-

Book
title Text
author PersonId

那么上面的表单将无法编译,并出现以下错误:-

Couldn't match expected type `KeyBackend Database.Persist.GenericSql.Raw.SqlBackend Person' with actual type `Text'
Expected type: Field
sub0
master0
(KeyBackend Database.Persist.GenericSql.Raw.SqlBackend Person)
Actual type: Field sub0 master0 Text
In the first argument of `areq', namely `textField'
In the second argument of `(<*>)', namely
`areq textField "author" Nothing'

我们现在如何定义作者字段?我们需要使用一元形式吗?

谢谢!

最佳答案

错误消息意味着您正在尝试使用文本(来自字段结果)作为键。

您可以使用checkMMap来包装textField并修改结果:

addBookForm = renderDivs $ Book
<$> areq textField "title" Nothing
<*> (entityKey <$> areq authorField "author" Nothing)
where
authorField = checkMMap findAuthor (personName . entityVal) textField

findAuthor name = do
mperson <- runDB $ selectFirst [PersonName ==. name] []
case mperson of
Just person -> return $ Right person
Nothing -> return $ Left ("Person not found." :: Text)

如果向 Person 字段添加唯一的构造函数,findAuthor 函数会变得更简单:

Person
name Text
...
UniquePerson name

然后您可以代替 selectFirst ...

mperson <- runDB $ getBy $ UniquePerson name

关于haskell - 如何在 Yesod 中为外键定义应用表单上的字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16771908/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com