Как получить справочную информацию о модели в 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 ответ

Решение

Я не смог найти какой-либо прямой способ (похожий на аннотации) для получения информации о модели. Но есть два способа сделать это.

  1. Incase, если ваша база данных SQL. Вы можете использовать esqueleto https://github.com/bitemyapp/esqueleto/blob/master/README.md.
  2. Напишите некоторый шаблонный код и получите информацию.

Создать 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')
Другие вопросы по тегам