0

2 つのドメイン クラスを考えてみましょう。仕事と見積もり。

ジョブには多くの見積もりがありますが、ジョブには受け入れられた見積もりもあります。受け入れられた見積もりは null 可能であり、特定の見積もりがユーザーによって受け入れられた場合にのみ設定する必要があります。次のように関係をマッピングしています (説明のために単純化しています)。

class Job {
    String title
    Quote acceptedQuote   
}

class Quote {
    Job job
    BigDecimal quoteAmount 
}

結果のテーブルはまさに私が必要とするものです (少なくとも審美的には) が、Quote を保存すると問題が発生します。Quote はコードのロジックに従って jobId で正常に保存されますが、残念ながら、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戦略は、これらの要件を満たさないのでしょうか?

どんな助けでも大歓迎です。

4

3 に答える 3

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)
    }

}
于 2013-05-09T22:43:04.140 に答える
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()

終わり。

acceptedQuoteジョブで参照が必要ですか? いいえ
受け入れられた見積もりにアクセスするにはどうすればよいですか?

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

于 2013-05-09T22:46:15.020 に答える