2014-01-15 67 views
0

對不起,我不能爲這個問題想出一個更好的標題,但給了我最好的拍攝。我有域類UserPost-a user有許多posts,並且post屬於用戶,如下所示。Grails:如何在其他域中「訪問」域類實例變量?

class User { 

    String name 

    static hasMany = [ posts : Post ] 

    static constraints = { } 
} 

class Post { 

    String content 

    static belongsTo = [ user : User ] 

    static constraints = { } 
} 

我有另一個域類Status如下。

class Status { 
    Boolean isActive 

    static constraints = { 
    } 
} 

每個userpoststatus,我想知道如何實現?我能想到這樣做的不同的方法夫婦是:

  1. 繼承:讓UserPost延長Status,並在Status使用static mapping = { tablePerHierarchy false }。然後UserPost會自動繼承Status的實例變量(並且它們會保存在單獨的表中)。然而,這種方法似乎並不合適,因爲UserPost實際上並不是Status
  2. 我可以重新定義Status實例變量在UserPost,然後做這樣的事情在UserPost
 

    static constraints = { 
     importFrom Status 

     // other constraints 
    } 

問題:

  • 是一種方法好過其他?
  • 有沒有更好的方法來實現這一目標?
  • Grails專家可以推薦哪些最佳實踐?

注:Status域有很多實例變量(什麼是這裏介紹的是一個精簡版),我需要「訪問」的情況下,從許多其他領域變量(UserPost,和許多其他) 。否則,我可能會騎上Status域,只需分別在UserPost中定義這些實例變量。上面提到的方法2是這樣做的,除了它通過使用importFrom Status節省重新輸入約束。

回答

1

我同意繼承不是一個乾淨的選項。你的第二種方法似乎正確,但你爲什麼需要「importFrom」?通過在User和Post中將Status定義爲實例變量,Status將負責驗證其自己的變量。你仍然可以像這樣訪問Post/User的Status實例變量:

user.status.isActive 
+0

謝謝Rami。其實我的意思是在'User'和'Post'中都包含'Boolean isActive'而不是'Status status'。在這種情況下,我需要'importFrom Status'來處理約束。但我想我明白你的意思。雖然,如果我在'User'和'Post'中聲明'Status status',並且執行'def user = new User(name:「my name」,status:new Status(isActive:true))''和'user。保存(failOnError:true,flush:true)',代碼失敗時會說'NULL不允許列'STATUS_ID「'!所以我肯定錯過了一些東西。任何澄清將不勝感激! – tikka

+0

好的,我想我明白了。在保存用戶user.save(failOnError:true,flush:true)'之前,我必須顯式地保存狀態'status.save(failOnError:true,flush:true)',並且它工作正常。謝謝! – tikka

+0

太棒了!另外,如果您是Grails的新手,那麼我建議您閱讀關於關係中級聯和所有權的信息。很高興我能夠提供幫助。 –