我在Persistent中定义了一对多关系,但无法弄清楚如何创建一个可以将其中一个外键作为输入的表单。简化我的用例:
Person
name String
Car
personId PersonId
name Text
type Text
现在,当我尝试为Car生成Form时,personId的字段类型应该是什么?我试过这样的事情,但得到了一个错误:
entryForm :: Maybe Car -> Form Car
entryForm car = renderDivs $ Car
<$> areq personIdField "Person" Nothing
<*> areq textField "Car Name" ( carName <$> car)
<*> areq textField "Type" ( carType <$> car)
当我运行上述内容时,我收到错误: Not in scope: `personIdField'.
我尝试了intField
并说:
Couldn't match expected type `KeyBackend
persistent-1.2.1:Database.Persist.Sql.Types.SqlBackend Person'
with actual type `Text'
Expected type: Field
m0
(KeyBackend
persistent-1.2.1:Database.Persist.Sql.Types.SqlBackend Person)
Actual type: Field m0 Text
In the first argument of `areq', namely `intField'
In the second argument of `(<$>)', namely
`areq intField "Person" Nothing
理想情况下,我想填充人名的下拉列表(如果没有太多)或者有太多的自由格式文本字段(例如,使用自动填充)。关于如何从用户输入外键的任何建议?
更新:
我尝试使用selectField如下,但不确定我是否正确执行此操作。我仍然得到一个错误。首先,我创建了一个where语句来获取personId:
where
personId = do
person <- runDB $ selectFirst [] [Asc PersonName]
case person of
Just (Entity pId p) -> return pId
-- Nothing -> ???
然后我将我的第一个areq改为
<$> areq (selectField [("First", personId)]) "Person Name" Nothing
谢谢!
答案 0 :(得分:3)
我能够弄清楚如何正确使用selectField。这就是我最终做的事情:
where
people = do
entities <- runDB $ selectList [] [Asc PersonName]
optionsPairs $ map (\p -> (personName $ entityVal p, entityKey p)) entities
表单字段变为:
<$> areq (selectField people) "Person Name" Nothing
我还没有想出自由表格,但这是一个好的开始。