2011-05-06 24 views
4

我正在使用grails一段時間。有些東西我仍然不知道如何正確實施。GORM:列出屬於用戶的所有域實例(根對象)

我有一個域類(比方說用戶),其中包含一個列表,可能有潛在的任何域類(項目,用戶等等)。有沒有辦法使這個開箱即用?

目前,我正在做的方式如下:

我有一個包含以下屬性的UserLink:

class UserLink{ 
    User user 
    String className 
    Long refId 
} 

然後,我有它加載一個服務給定用戶的各個環節,然後是鏈接中的相應對象,並將它們作爲列表返回。

我覺得這個方法是不是最好的,並可能導致未來業績問題

你覺得呢?你有更好的設計理念嗎?

感謝, 薩科

回答

2

是不是真的有,或只類的某些子集?我相信你會有更多的領域類與用戶沒有直接關係。

如果是這樣,您可以創建一個UserAsset類或接口與belongsTo=[user: User]道具,並繼承/實施它。

然後找到所有域類實現它,並用clazz.findByUser()每個查詢,如:

GrailsClass[] classes = grailsApplication.getArtefacts('Domain') 
GrailsClass[] userAssetClasses = 
    classes.clazz.findAll { UserAsset.class.isAssignableFrom(it) } 
List<UserAsset> allUserAssets = 
    userAssetClasses.clazz*.findAllByUser(myUser).flatten() 

編輯:如果我們談論L:男,它只改變最後一行,一路userAssetClasses是查詢。

UserAsset將有一個hasMany=[users:User]財產。

像:

List<UserAsset> allUserAssets = userAssetClasses.clazz.collect{ 
    Class domainClass -> 
    it.withCriteria { 
     users { 
      eq('id', myUser.id) 
     } 
    } 
}.flatten() 
+0

謝謝您的回答,但這只是一個一對多的關係的工作。問題是,許多用戶在他們的列表中可能具有相同的對象。是的,你是正確的,並不是每個域對象都與用戶有關(但其中很多)。 感謝您的快速回復! – Nicolas 2011-05-06 13:35:06

+0

它變化很小 - 請看看最新的想法。 – 2011-05-11 07:38:59

+0

我Viktor,再次感謝您的努力!我最終通過分解類層次結構來完成它。原來在代碼中更優雅。其他解決方案會使代碼變得複雜以理解和維護。謝謝 – Nicolas 2011-05-12 07:40:18

相關問題