2012-09-16 22 views
8

In base a http://www.yesodweb.com/blog/2010/07/database-migrations è stata aggiunta una classe di prodotti DeleteCascade alcuni anni fa. Posso solo supporre che questo sia pensato per essere aggiunto ai modelli. Dopo aver configurato la configurazione dei miei mi piace:Yesod delete cascade

Field 
    ... 
    foreignId ForeignId DeleteCascade 

la mia domanda compila bene. ma lo schema del DB è invariato, e l'eliminazione non è a cascata dall'applicazione neanche. Dovrei solo (rabbrividire) farlo manualmente? C'è un modo migliore?

sto utilizzando l'impalcatura Yesod (Application.hs, Foundation.hs, Settings.hs, ...)

risposta

8

Utilizzando le risposte esistenti, ho impiegato del tempo per capire come utilizzare la cascata di eliminazione. Come principiante in Yesod, non avevo una panoramica su Yesod.

Per ottenere una cascata di eliminazione funzionante, non è necessario modificare nulla nel modello. Supponiamo che il tuo file delle entità sia simile al seguente e desideri eliminare lo Entry.

Entry 
    title Text 
Comment 
    entry EntryId 

Non è necessario modificare questo file di entità.

Il codice da cui si guidano le entità, in genere in Model.hs, sembra così.

share [ mkPersist sqlOnlySettings 
     , mkMigrate "migrateAll" ] 
    $(persistFileWith lowerCaseSettings "config/models") 

Aggiungere mkDeleteCascade per ottenere le istanze DeleteCascades per le entità.

share [ mkPersist sqlOnlySettings 
     , mkDeleteCascade sqlOnlySettings 
     , mkMigrate "migrateAll" ] 
    $(persistFileWith lowerCaseSettings "config/models") 

Una volta che si desidera eliminare la voce, per esempio nel postDeleteEntryR Handler è necessario utilizzare deleteCascade o deleteCascadeWhere anziché eliminare.

runDB $ deleteCascade entryId 

L'utilizzo di delete ha lo stesso effetto di prima.

4

Al fine di trarre vantaggio da DeleteCascade, è necessario utilizzare le funzioni sia della deleteCascade o deleteCascadeWhere . Funzioneranno solo se ci sono istanze di DeleteCascade disponibili per i tuoi tipi. Il modo più semplice per ottenerli è con la funzione mkDeleteCascade.

+0

Grazie per la risposta finora. Potresti espanderti un po '? Il mio problema: http://hackage.haskell.org/packages/archive/persistent-template/1.0.0/doc/html/Database-Persist-TH.html dice che gli utenti normali non dovrebbero aver bisogno di usare mkDeleteCascade. http://hackage.haskell.org/packages/archive/persistent/1.0.0/doc/html/src/Database-Persist-Query-Internal.html dice che deleteCascadeWhere è solo per uso interno. Inoltre non riesco a trovare documenti utili su deleteCascade. Potresti mostrarmi/indicarmi un esempio operativo minimo di questo? – abesto

+0

I commenti sull'uso interno o sugli utenti regolari non sono stati applicati alle funzioni stesse, ma ai moduli. I moduli a cui si collega vengono entrambi riesportati da altri moduli (ad es. Yesod.Persist). Non c'è alcun problema con l'utilizzo di tali funzioni. Sfortunatamente non ho un esempio completo, comunque. –

Problemi correlati