2014-06-16 55 views
0

我有兩個域類。其一是:Grails中兩個域類的唯一約束條件

class User { 
    String login 
    String password 
    String firstName 
    String lastName 
    String address 
    String email 

    static constraints = { 
     login blank:false, size:5..15,matches:/[\S]+/, unique:true 
     password blank:false, size:5..15,matches:/[\S]+/ 
     firstName blank:false 
     lastName blank:false 
     email email: true 
    } 
} 

而另一種是

class AddWebsite { 

String website 
User user 
static constraints = { 
        website blank:false 
        website(unique: ['user']) 
        } 
} 

我在後端使用MongoDB的工作。我需要一個特定的登錄值,所有的siteURL值應該是唯一的。例如:login = [email protected]。那麼這個用戶只能在數據庫中擁有所有唯一的url。但是對於不同的用戶可以存在相同的URL。我該如何使用獨特的約束或任何其他方法來做到這一點?

+0

'SiteURL'包含其他字段嗎? – injecteer

+0

否。唯一的字段是siteURL。 –

+1

因此,你並不需要將它們包裝到一個對象中。默認的mongo原始集合類型在這裏可以做得很好 – injecteer

回答

0

它終於奏效了。我在進入網站時得到的用戶不能爲空錯誤,雖然它沒有在AddWebsite域類中進行驗證。我做了以下修改,並得到它的工作:

class AddWebsite{ 
    String website 
    User user 
    static belongsTo = [user: User] 
    static constraints = { 
     website(url:true, unique: ['user']) 
    } 
} 

而在我的控制器還,我的用戶對象的值設置爲會話變量:

def addWebsites() { 
    if(request.method == 'POST') { 
     def w = new AddWebsite() 
     w.properties[ 
        'website' 
       ] = params 
     w.user = session["user"]      //modified to make it work 
    if(w.save()) { 
      render view:'addWebsites', model:[message: "Successfully saved"] 
     } 
     else { 
      return [addWebsite:w] 
     } 
    } 

希望它可以幫助別人:)

1

在這種情況下,你應該能夠放在AddWebsite域類唯一約束,如這樣的:

class AddWebsite { 
    String website 
    User user 
    static constraints = { 
    website(blank:false, unique: ['user']) 
    } 
} 

這將確保每個網站在每個用戶的數據庫中唯一。請注意,多個約束條件適用於屬性網站。

編輯匹配更新的問題。

+0

我加了這個約束。它仍然允許我通過相同的用戶標識添加相同的網址。 –

+0

編輯您的問題以包含更新的代碼。這種獨特的約束應該起作用。其他事情正在發生。 –

+0

好吧,我剛剛更新它。我只是將名稱siteURL更改爲網站。如果你能想出這將是一個很大的幫助。我堅持了2天現在:( –

1

使用嵌入的子文檔在User的右側存儲SiteURL實例。然後你將集合定義爲一個Set,它確保它的所有條目都是唯一的。如果您想使用默認蒙戈集合類型或要堅持的順序,這樣定義一個攔截器:

def beforeSave = { 
    urls = urls.unique() 
} 

UPDATE: 如果您的網址是普通字符串,使用默認的原始集合(無hasMany):

class User { 
    String login 
    //... 
    Set urls = new HashSet() 
}