2012-09-16 17 views
8

http://www.yesodweb.com/blog/2010/07/database-migrationsによると、DeleteCascadeは数年前にタイプクラスが追加されました。私はこれがモデルに追加されることを前提としています。私のモデルをこのように設定した後:Yesod削除カスケード

Field 
    ... 
    foreignId ForeignId DeleteCascade 

私のアプリケーションはうまくコンパイルされます。 DBスキーマは変更されず、削除はアプリケーションによってカスケードされません。私はちょうど(shudder)それを手動で行うべきですか?より良い方法がありますか?

私はイェソド足場(Application.hs、Foundation.hs、Settings.hs、...)

答えて

8

既存の回答を使用すると、削除カスケードの使用方法を理解するのに時間がかかりました。 Yesodの初心者として、私はYesodの概要を持っていませんでした。

作業中の削除カスケードを取得するには、モデル内の何も変更する必要はありません。エンティティファイルが次のように表示され、Entryを削除するとします。

Entry 
    title Text 
Comment 
    entry EntryId 

このエンティティファイルを変更する必要はありません。

エンティティを導く元のコードは、通常Model.hsです。

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

mkDeleteCascadeを追加して、エンティティのDeleteCascadesインスタンスを取得します。

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

あなたのエントリを削除したいたら、postDeleteEntryRハンドラで、たとえばあなたが代わりに削除のdeleteCascadedeleteCascadeWhereを使用する必要があります。

runDB $ deleteCascade entryId 

deleteを使用すると、前と同じ効果があります。

4

DeleteCascadeを利用するためには、あなたはどちらかdeleteCascadeまたはdeleteCascadeWhere機能を使用する必要がありますを使用しています。これらは、あなたの型に使用可能なDeleteCascadeインスタンスがある場合にのみ機能します。これらを取得する最も簡単な方法は、mkDeleteCascade関数を使用する方法です。

+0

これまでの回答に感謝します。少し拡大できますか?私の問題:http://hackage.haskell.org/packages/archive/persistent-template/1.0.0/doc/html/Database-Persist-TH.htmlによれば、通常のユーザはmkDeleteCascadeを使う必要はありません。 http://hackage.haskell.org/packages/archive/persistent/1.0.0/doc/html/src/Database-Persist-Query-Internal.htmlによると、deleteCascadeWhereは内部使用のみです。私もdeleteCascadeで有用なドキュメントを見つけることができません。あなたはこれの最小の実例を見せて/私に指摘できますか? – abesto

+0

内部使用または一般ユーザーに関するコメントは、機能自体にではなくモジュールに適用されました。リンク先のモジュールは、他のモジュール(egod.Persistなど)によって再エクスポートされます。これらの関数の使用には問題ありません。残念ながら私は完全な例はありません。 –

関連する問題