2012-02-09 23 views
0

我有以下(簡化的)域類Grails的一個一對多/錯誤地刪除所有「manys」

class Filter { 
    String name 
    static hasMany = [answers:Answer] 
    static belongsTo = [user:User] 
} 

class User { 
    String name 
    static hasMany = [answers:Answer, filters:Filter] 
} 

class Answer { 
    String text 
} 

然後,添加答案被正常使用的用戶。當我刪除1個回答用戶的出現該問題:

def delete = { 
    def answer = Answer.get(params.id) 
    def users = User.withCriteria() { 
     answers{ 
      eq("id", answer.id) 
     } 
    } 

    for (user in users) 
     user.removeFromAnswers(answer) 

    answer.delete(flush:true) 
    redirect(action:"index") 
} 

這裏會發生什麼情況是,所有的用戶 - >答案協會被刪除。

我只想刪除這1個答案,並且導致所有關聯使用答案。

我知道這與缺少屬於關聯的事,但我不能使用它,因爲一個ansswer可以屬於一個用戶或一個過濾器...

回答

0

您可以添加belongsTo對其進行設置到nullable

class Answer { 
    String text 

    static belongsTo = [user:User, filter:Filter] 
    static constraints = { 
     user nullable:true 
     filter nullable:true 
    } 
} 

,然後就直接刪除Answer在控制器:

def delete = { 
    def answer = Answer.get(params.id) 
    answer.delete(flush:true) 
} 

格姆會照顧資源的爲你級聯。

+0

mhhh yes that works ... but then it is also possible to have a Answer which has no filter and no user ...這就是爲什麼我試圖不使用belongsTo。 – user1200271 2012-02-09 21:21:06

+0

那麼......你的回答對我所問的問題來說是正確的。我假設我真正想要的是與2個聯合表格的多對多關係:1爲過濾器 - >答案,1爲用戶 - >答案。 GORM實際上是爲我做的,因爲我沒有指定belongsTo關係 – user1200271 2012-02-09 21:40:54

+0

如果沒有'belongsTo',仍然可以有一個沒有'Filter'和'User'的'Answer'。您始終可以添加自定義約束或beforeInsert/beforeUpdate以防止發生此情況。 – 2012-02-09 21:41:11