2012-01-07 16 views
5

の代わりに更新する任意のドメインクラスの削除を許可しないようにGrailsでの簡単な方法はありますか?むしろ何かが削除されるたびに更新される各ドメインで削除フラグを持っている。Grailsは削除

また、実質的にすべてのリスト/ショー方法はフラグがtrueの削除オブジェクトを表示してはなりません。

私は手動ですべてのコントローラ内のすべての私のCRUDメソッドを編集することを行うことができます知っているが、すべてがどこかのフラグを変更することによって行うことができるのGrailsで作業するときには、少しあまりにも多くの仕事です!

マイ通常のlistメソッドは、ほとんど私のプロジェクト内のすべてのリスト方法は唯一、ユーザーの会社に所属するユーザアクセス物事をすることができ、次のようになります。

def list = { 
    params.max = Math.min(params.max ? params.int('max') : 10, 100) 
    def documentsList = Documents.createCriteria().list(params){ 
     eq("company.id",session.companyId) 
     maxResults(params.max) 
     order("dateCreated","desc") 
     //firstResult(params.offset) 
    } 
    [documentsInstanceList: documentsList , documentsInstanceTotal: documentsList.getTotalCount() ] 
} 

答えて

11

すべてのドメインクラスの削除とリストメソッドをovverideする必要があります。私は削除して、プロパティセットを持っていたクラスのリストも私はこの振る舞いをしたいドメインクラスに静的プロパティを追加し、のみオーバーライドしますけれども

class BootStrap { 

    def grailsApplication 

    def init = { servletContext -> 

    for (dc in grailsApplication.domainClasses) { 

    dc.clazz.exists(-1); //to register meta class 

    def gormSave = dc.clazz.metaClass.getMetaMethod('save');   
    dc.clazz.metaClass.delete = { -> 
     delegate.deleted = true 
     gormSave.invoke delegate 
    } 

    dc.clazz.metaClass.delete = { Map args -> 
     delegate.deleted = true 
     gormSave.invoke(delegate, args) 
    } 

    dc.clazz.metaClass.static.list = { -> 
     def crit = delegate.createCriteria(); 
     def list = crit.list{ 
      eq('deleted', false) 
     } 
     return list; 
    } 



    } 
} 

    def destroy = {} 
} 
+1

は、私は、このソリューションが好きなあなたのブートストラップには、このようなコードを追加します。本当に。そうすれば、本当に削除されるドメインクラスのインスタンスを引き続き持つことができます。 – erturne

+0

良い点。また、デフォルトのdeleteメソッドが変更されたドメインクラスには、hardDeleteのような新しいメソッドを作成するのが理にかなっています。 –

+0

良いアイデア。また、上記の静的なプロパティではなく、削除されたプロパティの存在を探します。これは簡単にGrailsプラグインに変換することができます。ソフト削除と呼んでください。 – erturne

関連する問題