2016-12-01 9 views
1

ドメインPersonとドメイン趣味があり、Person hasMany趣味がある場合、同じ趣味がPersonコレクションに複数回追加されないようにするにはどうすればよいでしょうか。ドメインリストのGrails固有の制約

`

class Hobby { 
     String name 
     static belongsTo = [person: Person] 
    } 
    class Person 
     String name 

     static hasMany =[hobby: Hobby] 

     static constraints= { 
     hobby.name unique: true   //like this 
     } 
    } 

答えて

1

よう

すなわち何かこれは、カスタムvalidatorのための知事のユースケースです。上記

class Hobby { 
    String name 
    static belongsTo = [person: Person] 
} 
class Person 
    String name 

    static hasMany = [hobby: Hobby] 

    static constraints = { 
     hobby validator: { val, obj -> 
     if (obj.hobby.find{ (it.name.equals(val.name) && it.id != val.id) }) return ['unique'] 
     } 
    } 
} 

ちょうど私の頭の上から何かで、タイプミスやロジックがあるかもしれない:私はあなたが1で可能である何のために感覚を得るが、あなたはこのようなものを使用することができdocumentationを読むことをお勧めエラーですが、カスタムvalidatorを使用して独自の小切手を実装する方法の例です。 PersonあたりHobby独自の作成について

UPDATE グレッグの答えは、実際にこの問題に対処するためにはるかに簡単かつきれいな方法です。彼が指摘するように、実際には、PersonHobbyの間に関係が存在するため、カスタムバリデーターは必要ありません。

0

ドキュメント(http://docs.grails.org/2.5.5/guide/GORM.html#sets,ListsAndMaps)は、hasManyで定義されたコレクションはjava.util.Setであると言います。 Setには重複を含めることはできません。

だから、制約を定義する必要はなく、デフォルトでは要求された動作があると思います。

+0

私はそれがうまくいくとは思わない。セット内でユニークなのはIDです。私が避けようとしているのは、「名前」フィールドを複製することです。 – user1023110

+0

ホビーの名前をユニークにするよりもOKです。 –

+0

ええ、私はそれがどちらかと考えていません。 2人の別々の人々が "釣り"と呼ばれる趣味を持っている可能性があります – user1023110

3

私はこれが回答されているが、最も簡単な方法はこれを行うには本当に知っている:

class Hobby { 
    String name 
    static belongsTo = [person: Person] 

    static constraints = { 
    name unique: 'person' 
    } 
} 

これは、それは親、personの一人当たりhobbyはユニークな名前を持っていることを確認します。カスタムバリデーターの必要はありません。

+1

優秀なポイントGregg!私は質問に答える前に朝のコーヒーを終わらせなければならないと思います。 –

+0

@JoshuaMoore私はあなたの答えと質問を何度も読んでから鉱山を追加しました。私は確かにジョシュアがここで何をしているのか分かっていた。 :)私は何かが欠けていたと思った。 – Gregg

+1

信頼の投票ありがとう:) –

関連する問題