2012-09-16 30 views
8

De acuerdo con http://www.yesodweb.com/blog/2010/07/database-migrations se añadió una clase de tipo DeleteCascade hace unos años. Solo puedo suponer que esto debe ser agregado a los modelos. Después de configurar mi configuración de modelos de esta manera:Yesod eliminar cascada

Field 
    ... 
    foreignId ForeignId DeleteCascade 

mi aplicación compila bien. pero el esquema DB no se modifica, y tampoco la aplicación elimina en cascada la eliminación. ¿Debería simplemente (estremecerme) hacerlo manualmente? ¿Hay una mejor manera?

estoy usando el andamio Yesod (Application.hs, Foundation.hs, Settings.hs, ...)

Respuesta

8

Utilizando las respuestas existentes, me tomó un tiempo encontrar la manera de utilizar la cascada de eliminación. Como principiante en Yesod, no tenía una visión general de Yesod.

Para obtener una cascada de eliminación de trabajo, no necesita cambiar nada en el modelo. Digamos que su archivo de entidades tiene el siguiente aspecto y desea eliminar el Entry.

Entry 
    title Text 
Comment 
    entry EntryId 

No tiene que cambiar este archivo de entidad.

El código del lugar donde dirige las entidades, generalmente en Model.hs, se parece a eso.

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

Agregue mkDeleteCascade para obtener las instancias de DeleteCascades para sus entidades.

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

Una vez que quiere eliminar su entrada, por ejemplo en el postDeleteEntryR Handler se tienen que utilizar deleteCascade o deleteCascadeWhere en lugar de eliminación.

runDB $ deleteCascade entryId 

El uso de delete tiene el mismo efecto que antes.

4

Con el fin de tomar ventaja de DeleteCascade, es necesario utilizar funciones o bien el deleteCascade o deleteCascadeWhere . Estos solo funcionarán si hay instancias de DeleteCascade disponibles para sus tipos. La forma más fácil de obtenerlos es con la función mkDeleteCascade.

+0

Gracias por la respuesta hasta el momento. ¿Podrías expandir un poco? Mi problema: http://hackage.haskell.org/packages/archive/persistent-template/1.0.0/doc/html/Database-Persist-TH.html dice que los usuarios normales no deberían necesitar usar mkDeleteCascade. http://hackage.haskell.org/packages/archive/persistent/1.0.0/doc/html/src/Database-Persist-Query-Internal.html dice que deleteCascadeWhere es solo para uso interno. Tampoco puedo encontrar ningún documento útil en deleteCascade. ¿Podría mostrar/señalarme un ejemplo mínimo de trabajo de esto? – abesto

+0

Los comentarios sobre uso interno o usuarios regulares no se aplicaron a las funciones en sí, sino a los módulos. Los módulos a los que enlaza son reexportados por otros módulos (por ejemplo, Yesod.Persist). No hay problema con el uso de esas funciones. Desafortunadamente, no tengo un ejemplo completo, sin embargo. –

Cuestiones relacionadas