考虑两个域类;工作和报价。
Job有很多行情,但是Job也有一个被接受的报价。接受的报价是可以为空的,只有在用户接受特定报价后才能设置。我将关系映射如下(为了说明而简化)。
class Job {
String title
Quote acceptedQuote
}
class Quote {
Job job
BigDecimal quoteAmount
}
结果表正是我所需要的(至少在美学上),但是当我去保存报价时出现问题。 根据我的代码中的逻辑,使用jobId成功保存Quote,但不幸的是,quote的id作为acceptedQuote保存在Job表中。无论如何阻止这种级联关联?保持Quote的代码是相当基本的,看起来类似于以下内容;
def quoteInstance = new Quote(job: jobInstance, quoteAmount: amount)
if (quoteInstance.save(flush: true)) {
render view: 'show', model: [quoteInstance: quoteInstance]
break
}
显然,jobInstance被传递给Quote构造函数以保存Quote表中的关联,但我不知道如何防止将引用ID保存到作业表作为接受的引用。 也许我使用的GORM策略不能满足这些要求吗?
非常感谢任何帮助。
答案 0 :(得分: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
并且不用担心原来的问题。
您还可以向getter
课程添加一个瞬态及其Job
以获取已接受的Quote
class Job {
String title
static hasMany = [quotes: Quote]
static transients = ['acceptedQuote']
Quote getAcceptedQuote() {
return Quote.findByJobAndAccepted(this, true)
}
}
答案 1 :(得分:0)
Grails / GORM通过遵循约定优于配置的方法并使事情更加冗长,使关联变得更简单。
您如何看待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}
答案 2 :(得分:0)