yesod persist: получить список сущностей из списка ключей

предположим, у меня есть fooIds :: [Key Foo]. Как мне получить foos :: [Foo]?

Я старался

do
    foos <- map get fooIds

но это дает мне

No instance for (MonadBaseControl IO m0)
  arising from a use of `get'

Я предполагаю, потому что мне нужно использовать runDB. Но я не совсем уверен, как это работает.


person user316146    schedule 10.02.2013    source источник


Ответы (2)


Это будет выглядеть примерно так:

foos <- runDB $ mapM get fooIds

Однако это даст вам список Maybe Foo. Вы можете превратить это в список Foo, либо заменив get на get404, либо используя catMaybes. Обратите внимание, что это два разных подхода: при первом, если какой-либо идентификатор не существует, пользователь получит 404. При втором этот ключ будет просто проигнорирован.

person Michael Snoyman    schedule 10.02.2013
comment
Ах, спасибо! что если вместо этого у меня было mfooIds :: [Maybe (Key Foo)] и я хотел получить mfoos :: [Maybe Foo] ? Как мне сделать функцию get, которая принимает Maybe Key? - person user316146; 10.02.2013
comment
Неважно, получил это с mfoos <- runDB $ mapM (maybe (return Nothing) get) mfooIds - person user316146; 10.02.2013
comment
Если база данных удалена, есть ли разница (количество запросов) между runDB $ mapM get fooIds и fmap (runDB . get) fooIds? - person ptkato; 21.12.2016
comment
Каждый вызов runDB вводит другую транзакцию базы данных. - person Michael Snoyman; 23.12.2016

Другим полезным подходом будет

foos <- runDB $ mapM getJustEntity fooIds
person Jorge Añez    schedule 22.03.2020