Как получить справочную информацию о модели в Yesod?
У меня 3 модели
Address json
number Text
street Text
pincode Text
deriving Show
Person json
email Text
name Text
telephone Text
deriving Show
House json
rent Int
ownerId PersonId
addressId AddressId
deriving Show
Я хочу получить доступ ко всем домам. Что я могу получить, делая
getHouseR :: Handler Value
getHouseR = do
houses <- runDB $ selectList [] [Asc HouseRent]
return $ toJSON houses
Но я получаю только ссылки на другие объекты, такие как person & address
,
[{"rent":8000,"addressId":4,"ownerId":1,"id":3},{"rent":10000,"addressId":2,"ownerId":1,"id":1}]
Я хотел бы получить полную информацию о доме, что означает, решить, что ownerId & addressId
и получить эти данные, которые могут выглядеть,
[{"rent":8000,"address":{"number": "23", "street": "12/B", "pincode": "111111"},"owner":{"email": "hey@email.com", "name": "Moto", "telephone": "xxxxxxxxxx"},"id":3}]
Есть ли способ добавить информацию, как getForiegnData
на запрос, и что бы мне все это? Или любое другое решение?
1 ответ
Я не смог найти какой-либо прямой способ (похожий на аннотации) для получения информации о модели. Но есть два способа сделать это.
- Incase, если ваша база данных SQL. Вы можете использовать esqueleto https://github.com/bitemyapp/esqueleto/blob/master/README.md.
- Напишите некоторый шаблонный код и получите информацию.
Создать HouseResp
тип, который будет представлять ваше тело ответа, включая информацию о человеке и адрес.
data HouseResp = HouseResp
{ rent :: Int
, owner :: Person
, address :: Address
}
Затем измените getHouseR
чтобы получить полную информацию для каждого дома, используя доступный идентификатор ссылки.
getHouseR :: Handler Value
getHouseR = do
housesWithReference <- runDB $ selectList [] [Asc HouseRent]
houses <- sequence (Import.map getCompleteHouse housesWithReference)
return $ toJSON houses
getCompleteHouse :: Entity House -> Handler HouseResp
getCompleteHouse house = runDB $ do
let rent' = houseRent (entityVal house)
person <- getJust (houseOwnerId (entityVal house))
address' <- getJust (houseAddressId (entityVal house))
return (HouseResp rent' person address')