2013-04-25 11 views
8

Tak więc moje/config/modele wyglądają tak.Jaki jest najlepszy sposób robienia wielu w wielu w trwałym Yesod?

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

Załóżmy wejścia w bazie danych są Person "Batman"Person "Superman"Car "SUV"Car "Ford" odpowiednio.

Obecnie robię to, aby połączyć je w moim Handler.

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 

Czy jest to łatwiejszy sposób? Czy istnieje konwencja na wyrażenie takiej ekspresji?

Odpowiedz

1

Nie, obecnie nie ma żadnego stenogramu dla tego rodzaju zapytania (przynajmniej o tym myślę).

1

połączenia z błędami zatrzymają Twoją aplikację. logError może być lepiej.

Jest krótsza:

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

robię go pod obsługi, to daje mi analizować błąd, jakieś pomysły? 'postFromR :: Handler RepHtml postFormR = zrobić przypadku wynik FormSuccess res -> _ <- runDB $ wkładka $ PersonCar persionId carId _ -> $ (logError) "błąd"' – HHC

+0

@HHC, Dodałem blok wokół linii wstawiania, która później wymagała zwrotu. Testowany z instalacją yesod, chwyć kod ponownie. Sprawdź nazwy modeli (PesionId zamiast PersonId, PesonCar zamiast PersonCar) –

Powiązane problemy