2016-04-01 19 views
0

私は2つのドメインクラスCGroupとDirectoryを持っていますが、これらの多くのディレクトリの1つが "root"として知られていますが、 CGroupからアクセス可能である。すべてのCGroupは1つのrootのみを持つべきであり、カスケードは、ディレクトリの削除がそのすべての子を削除するように動作するはずです。GORMはhasMany関係のインスタンスに直接アクセスします

間違っているが、これは私がこれまで持っているものです。

class CGroup{ 
    ... 
    Directory root 

    static hasMany = [directory:Directory] 

    static constraints = { 
     root(unique:true) 
    } 
} 

class Directory { 

    static hasMany = [children:Directory] 
    ... 
    static belongsTo = [parent:Directory, 
         cgroup:CGroup] 

    static constraints = { 
     parent nullable: true 
    } 
} 

は基本的に、私はちょうど「1」側

答えて

1

に格納されている「多くの」コレクションから1つのインスタンスへの参照を、必要とします私はこれをいくつかの方法で試してみましたが、それを実現させる唯一の方法は、rootを一時的にヌル可能にすることでした。 Directoryのインスタンスはに保存されるか、cgroupがnull(これはaddToDirectoryを呼び出すときに設定される)なのでsave()呼び出しが失敗するまで保存できません。しかし、ヌル可能でない場合は、rootプロパティを設定せずにCGroupを保存することはできません。

だから私はrootがNULL可能で作られたが、rootがnullであり、任意のインスタンスがhasManyであるかどうか検証に失敗したカスタムバリデータを追加しました:

static constraints = { 
    root nullable: true, validator: { Directory root, CGroup cgroup -> 
     if (!root && cgroup.directory?.size()) { 
     return ['root.required'] 
     } 
    } 
} 

ですから、必要な値とし、なしCGroupインスタンスを救います任意の関連するインスタンス。その後addToDirectoryDirectoryインスタンスを添付して、カスタムのセッターでrootインスタンスを設定します。

void setRoot(Directory root) { 
    if (this.root) { 
     removeFromDirectory this.root 
    } 

    if (root) { 
     addToDirectory root 
    } 

    this.root = root 
} 

をして、もう一度それを保存:

def group = new CGroup(...).save() 

group.root = new Directory(...) 
group.addToDirectory(new Directory(...)) 
group.addToDirectory(new Directory(...)) 
group.save() 

g1.errors 
+0

はい!これはまさに私が探していたものです。あなたが述べた注文の問題は、私が直面した正確な問題でしたが、私はカスタムバリデーターに慣れていませんでした。それに、私は、かなり一般的なシナリオのように見えるものを見逃していたかもしれないと思った。 最後のコードブロックでは、2番目のaddToDirectoryが実際にsetRootを呼び出すべきではないでしょうか? Cheers – Alexjjsmith

+1

いいえ、ルートが最初に設定され、次に2つのインスタンスが追加され、合計3つのインスタンスが追加されます。save()を2回呼び出すと、ルートは設定され、そのインスタンスはhasMany、オプションでいくつかの追加インスタンス。 –