2013-09-23 16 views
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延長書)

我知道,在數據庫級別都會有書列「類」,將確定如果它是一本書或一HistoricalBook。

所以這裏是我的問題: 現在存檔書的最佳方式是什麼?不知怎的,在我看來,我只需要設置類的列爲新的價值......但到目前爲止,我沒有弄清楚如何以一種簡單的方式做到這一點。是否可以將Book投入到HistoricalBook並保存?或者,我是否必須刪除該書籍並使用相同的ID創建一本HistoricalBook?

回答

0

你所指的'class'列被稱爲鑑別器列,我不相信你可以改變它,至少不容易。我認爲你會發現沿着這條道路走下去會讓你頭痛得多,而不是好處。

但是,您可以在src/groovy中創建一個抽象類,並有兩個從其繼承的域類。然後,你會得到兩個共同字段的表(書& HistoricalBook)。在您的Book.delete服務/控制器功能中,您可以創建一個HistoricalBook並刪除Book

**編輯**

的src /常規/(包名)/ArchivableBook.groovy

abstract class ArchivableBook { 

    String name 
    //other properties 

    static constraints = { 
     ... 
    } 

} 

的grails-app /結構域/(包名)/預訂。常規

class Book extends ArchivableBook { 
    // ... 
} 

的grails-app /結構域/(包名)/HistoricalBook.groovy

class HistoricalBook extends ArchivableBook { 
    // ... 
} 
+0

嘿,謝謝你的回答。 不幸的是,這並不能解決我的主要問題 - >不顯示存檔的書籍。 Book.get Book.findXX Book.executeQuery Author.books ... 遍佈應用。 我想用這個構造來'刪除'書籍。只有在需要的地方纔能找到HistoricalBooks。例如跟蹤Book.id所在的日誌文件。 我知道我可以覆蓋獲取者和內容,但這是我的第一槍,結果太冒險,無法維護。 – user2808204

+0

對不起,我沒有意識到這已經在生產中。我修改了我的答案以反映替代方法。除上述響應外,您還可以查看[多個數據源](http://grails.org/doc/latest/guide/single.html#multipleDatasources)來歸檔數據。例如複製到'歸檔'數據源並從'生產'中刪除。 – dspies

+0

嘿,再次感謝;) 是的,我也在考慮這一點。我的案例中的Book表格並不是那麼龐大,這就是爲什麼我喜歡在一個表格中使用鑑別器和所有對象的想法。 我希望有一種方法做這樣的事情: ArchivableBook書= Book.get(1) 書=書作爲HistoricalBook book.save() 或相似,只是更新鑑別有價值的東西。 回退會是這樣的: 書書= Book.get(1) 歷史hbook =新HistoricalBook(book.properties) hbook.id = book.id book.delete() hbook.save() 這就是我需要用你的方法歸檔 – user2808204

3

所以我會處理這個不同

添加一個「歸檔」屬性到您現有的類。

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

然後,不要刪除只需將其設置爲true。

然後使用hibernate filters plugin過濾出存檔書籍。

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

這將適用於所有情況,除了當一個查詢不是從標準的要求(石英工作爲例)完成或者如果通過.get()完成。 .get()可以更改爲.findById()

+0

很酷的事情。感謝你的回答。沒有想到;)這是否適用於executeQuery()和標準?如果我有類作者{hasMany [books:Book]},這會工作嗎?所以如果我參考Author.books,我只能找到匹配默認過濾器的那些? 正如我在另一條評論中指出的那樣,Book的用法遍佈應用程序,我想盡可能少地觸及。因爲我不想教每個開發人員使用.findById而不是.book的.get。但是,如果僅僅是這樣,它可能是一個選擇。或者我可以覆蓋.get() 無論如何..感謝您的建議 – user2808204

+0

您必須查看插件文檔以瞭解它如何適用於您使用Book的方式的具體細節,但我可以告訴你與標準查詢和HQL一起工作。 –