2013-04-25 3 views
8

Итак, мои/config/models выглядят так.Какой лучший способ сделать много-ко-многим в Persistent Yesod?

Person 
    name Text 
Car 
    name Text 
PersonCar 
    personId PersionId eq 
    carId CarId eq 
    UniquePersonCar personId carId 

Предположим, входы в базе данных являются Person "Batman"Person "Superman"Car "SUV"Car "Ford" соответственно.

В настоящее время я делаю это, чтобы связать их с моим обработчиком.

runDB $ do 
    person <- selectFirst [PersonName ==. "Batman"] [] 
    car <- selectFirst [Carname ==. "SUV"] [] 
    let Entity personId _ = case person of 
          Just info -> infor 
          Nothing -> error "no such Person" 
    let Entity carId _ = case car of 
          Just info -> infor 
          Nothing -> error "no such Car" 
    _ <- insert $ PersonCar personId carId 

Есть ли более простой способ сделать это? Существует ли конвенция для такого выражения?

ответ

1

Нет, в настоящее время нет сокращений для такого запроса (о котором я могу думать, по крайней мере).

1

Призыв к ошибке остановит ваше приложение. logError может быть лучше.

Это короче:

import Data.Conduit 
import qualified Data.Conduit.List as DCL 

runDB $ do 
    mbPersonId <- runResourceT $ selectKeys [PersonName ==. "Batman"] [] $$ DCL.head 
    mbCarId <- runResourceT $ selectKeys [CarName ==. "SUV"] [] $$ DCL.head 

    case (mbPersonId, mbCarId) of 
     (Just personId, Just carId) -> do 
       _ <- insert $ PersonCar personId carId 
       return() 

     _ -> $(logError) "error looking for Batman and SUV" 
+0

Я делаю это под обработчиком, это дает мне разобрать ошибки, какие-то идеи? 'postFromR :: Handler RepHtml postFormR = сделать случай результат FormSuccess Рез -> _ <- runDB $ вставка $ PersonCar persionId carId _ -> $ (LogError) "ошибка"' – HHC

+0

@HHC, я добавил блок вокруг строки вставки, после чего требуется обратное выражение. Протестировано с помощью установки Yesod, снова возьмите код. Проверьте имена своих моделей (PesionId вместо PersonId, PesonCar вместо PersonCar) –

Смежные вопросы