0

Grails 2.1.5 プロジェクト内に既存のドメイン ブックがあるとします。これまで、私は常にこのテーブルから本を削除していました。しかし、今は本を物理的に削除するのではなく、アーカイブしたいと考えています。Book.get/findXX/executeQuery/... または Author.books -> を実行するコードで何も変更する必要がないように、アーカイブされていない本のみを検索します。

したがって、拡張ドメイン クラスを使用すると、(Grails > 2.x 以降) 非常にうまく機能する可能性があると思います。

例えば

class ArchivableBook {
    // some properties
    static mappings = {table 'book'}
}

class Book extends ArchivableBook {
    // ...
}

class HistoricalBook extends ArchivableBook {
    // ...
}

(おそらく、HistoricalBook に Book を拡張させるだけでも十分です)

DB レベルでは、Book に Book か HistoricalBook かを識別する列「クラス」があることを知っています。

ここに私の質問があります: 今本をアーカイブする最良の方法は何ですか? どういうわけか、クラス列を新しい値に設定するだけでよいように思えます...しかし、これまでのところ、簡単な方法でそれを行う方法がわかりませんでした。Book を HistoricalBook にキャストして保存することはできますか? または、Book を削除して、同じ ID を持つ HistoricalBook を作成する必要がありますか?

4

2 に答える 2

3

だから私はこれに別の方法でアプローチします

「アーカイブされた」プロパティを既存のクラスに追加します。

class Book {
    ...
    Boolean archived
    ...
}

次に、削除する代わりに、これを true に設定します。

次に、休止状態フィルター プラグインを使用して、アーカイブされた書籍を除外します。

class Book {
    ...
    Boolean archived
    ...
    static hibernateFilters = {
        notArchivedFilter(condition:'archived=0', default:true)
    }
}

これは、クエリが標準リクエスト (例として Quartz ジョブ) から実行されない場合、または を介し​​て実行される場合を除いて、すべての場合に機能します.get().get()に変更できます.findById()

于 2013-09-23T20:23:30.860 に答える
0

あなたが参照している「クラス」列は識別子列と呼ばれ、少なくとも簡単には変更できないと思います。その道をたどると、メリットよりも頭痛の種の方が多いことがわかると思います。

ただし、src/groovy に抽象クラスを作成し、そこから 2 つのドメイン クラスを継承させることもできます。次に、共通のフィールドを持つ 2 つのテーブル (Book と HistoricalBook) が作成されます。Book.deleteサービス/コントローラー関数では、 を作成しHistoricalBookBook.

** 編集 **

src/groovy/(パッケージ名)/ArchivableBook.groovy

abstract class ArchivableBook {

    String name
    //other properties

    static constraints = {
      ...
    }

}

grails-app/domain/(パッケージ名)/Book.groovy

class Book extends ArchivableBook {
    // ...
}

grails-app/domain/(パッケージ名)/HistoricalBook.groovy

class HistoricalBook extends ArchivableBook {
    // ...
}
于 2013-09-23T18:13:22.913 に答える