2012-01-19 13 views
2

ソフト削除を実装する良い方法は何ですか?私のクラスでdeletedプロパティを持つことができますが、私の質問は簡単にどのようにdeleted = true私の検索やリストにあるインスタンスを無視することです。だから、ソフト削除を実装する方法

はなく、Domain.findByDeleted(true)はちょうどDomain.list()ではなくDomain.findByPropertyAndDeleted('property', true)がちょうどDomain.findByProperty('property')を言うと言っよりも、削除されたインスタンスを無視してもらうと言って。

いい方法がありますか?

+0

これはあなたを助けます:http://stackoverflow.com/questions/8768534/grails-update-instead-of-delete/8768728 –

答えて

7

これにはnamed queryを使用することをおすすめします。あなたは私たちは、ドメインクラスのlist()get()といくつかのより多くのメソッドをオーバーライドするために使用しているDomain.notDeleted.list()またはDomain.notDeleted.findByProperty(value)

0

のように使用することができ

static namedQueries = { 
    notDeleted { 
     ne 'deleted', true 
    } 
} 

ような何か。今、私たちは、ブートストラップオンA.delete(log: true)

ような構文を使用することができ、我々は実行します。

grailsApplication.domainClasses.each { GrailsDomainClass domainClassInfo -> 
    def oldGormDelete = domainClassInfo.metaClass.getMetaMethod('delete', [] as Class[]) 
    assert oldGormDelete 
    domainClassInfo.metaClass.delete = { Map params -> 
     ... 
     def result = oldGormDelete.invoke(delegate) 
     ... 
    } 
} 
+0

これは私がこの戦略に出会った2回目です。私はあまりにもGrailsメタプログラミングに精通していません、ここで何が起こっているのか説明してください、代理人を呼び出すことができますか? – gotomanners

+1

私はGroovyメタプログラミングを使用しています(http://groovy.codehaus.org/JN3525-MetaClasses、 "ExpandoMetaClass"セクションを参照)。クラスの '' metaClass'プロパティでは、静的 'delete(Map params)'メソッドの中で、特定のメソッドのシグネチャの代わりにクロージャを呼び出すように割り当てています。 'delegate'は、' this'や 'owner'のようなGroovyキーワードです。つまり、closureがメソッドとして呼び出されるオブジェクトを意味します - http://groovy.codehaus.org/Closuresを参照してください。 'invoke()'は、 'Closure'が' this'と与えられた引数のリストでそれを実行するメソッドです - 最初のものの後のパラメータは呼び出しの引数として使用されます。 –

1

hibernate filter pluginは、自動的に特定のドメインクラスに対して実行されるすべてのクエリに述語deleted = falseを追加することができます。しかし、私のテストによると、このプラグインはGrails 2.0.0では動作しません。

+0

これまでに一番きれいな答えです。 –

関連する問題