2013-05-09 45 views
0

考慮兩個域類;工作和報價。Grails:防止具有多個關係的兩個域類之間的級聯關聯

工作有許多行情,但工作也有一個公認的報價。接受的報價是可以爲空的,只有在特定的報價被用戶接受後才能設置。我有如下關係映射(爲了說明的目的而簡化)。

class Job { 
    String title 
    Quote acceptedQuote 
} 

class Quote { 
    Job job 
    BigDecimal quoteAmount 
} 

生成的表格正是我所要求的(至少在美學上),但是當我去保存報價時出現問題。 根據我的代碼中的邏輯,Quote成功保存了一個jobId,但不幸的是,報價的id作爲acceptedQuote保存在Job表中。無論如何阻止這種級聯?持續引用的代碼是相當基本的,看起來如下所示:

def quoteInstance = new Quote(job: jobInstance, quoteAmount: amount) 
if (quoteInstance.save(flush: true)) { 
    render view: 'show', model: [quoteInstance: quoteInstance] 
    break 
} 

顯然jobInstance傳遞給報價構造保存在報價表中的關聯,但我不知道如何預防報價編號保存到工作表作爲接受報價。 也許我正在使用的GORM策略不能滿足這些要求?

任何幫助將不勝感激。

回答

1

這可能不是你所期待的,但我居然會不同模型這一點 - 我會接受的國旗在Quote域:

class Job { 
    String title 
    static hasMany = [quotes: Quote] 
} 

class Quote { 
    static belongsTo = [job: Job] 
    BigDecimal quoteAmount 
    Boolean accepted 
} 

然後你的持久看起來是這樣的:

jobInstance.addToQuotes(new Quote(quoteAmount: 123.34, accepted: false)) //or true 

並且不擔心您的原始問題。

你也可以添加一個短暫的,其getterJob類來獲取接受Quote

class Job { 
    String title 
    static hasMany = [quotes: Quote] 

    static transients = ['acceptedQuote'] 

    Quote getAcceptedQuote() { 
     return Quote.findByJobAndAccepted(this, true) 
    } 

} 
+0

賓果!下次我不得不打字得更快。 :) – dmahapatro 2013-05-09 22:47:13

+0

偉大的思想認爲一樣@dmahapatro! – Kelly 2013-05-09 22:49:38

+0

巧合的是,我是在評論你所做的同一句話。 :) @Kelly添加到我的搭檔程序員名單中。 :) – dmahapatro 2013-05-09 23:10:38

0

Grails的/格姆已經按照約定的方法優於配置,使事情變得更加冗長取得的關聯更簡單。

您如何看待domain類的下列結構?

class Job { 
    String title 
    static hasMany = [quotes: Quote]//Job has many Quotes. Note: Accepted Quote is one of them. 
} 

class Quote { 
    BigDecimal quoteAmount 
    Boolean isAccepted 

    static belongsTo = [job: Job]//Quote always belongs to a Job. 
    //When a Job is deleted, quote is also cascade deleted. 
} 

現在,如果您創建報價如下圖所示,然後一切都應該很好地工作:

def job = new Job(title: "Test Job").save() 
//Just adding a quote 
def quoteInstance = new Quote(quoteAmount: amount) 
job.addToQuotes(quoteInstance) 
job.save() 

//Now accepting that quote 
quoteInstance.isAccepted = true 
job.save() 

完成。

我們是否需要Job中的acceptedQuote參考?否
如何獲得acceptedQuote?

def acceptedQuote = job.quotes.find{it.isAccepted}

+0

我還會在'Quote'上添加一個自定義驗證約束,以防止'Job'擁有多個接受的'Quote' – 2013-05-10 08:49:36