私は次のドメインを持っています:
class Attribute {
static hasMany = [attributeParameters: AttributeParameter]
}
class AttributeParameter {
String value
Integer sequenceNo
static belongsTo = [attribute: Attribute]
}
属性の既存のすべてのAttributeParametersを表示し、ユーザーがそれらの値を入力して[保存]をクリックできるようにするフォームがあります。保存時に、各AttributeParameter(すでにIDを持っている)を更新する必要があります。
現在、これを機能させるためにHTMLを作成する方法について空白を描いています。私はこれを試しました:
明確にするために簡略化されたコード:
<form>
<input type="hidden" name="attributeParameters[0].id" value="1" />
<input type="text" name="attributeParameters[0].value" value="1234567" />
<input type="hidden" name="attributeParameters[1].id" value="2" />
<input type="text" name="attributeParameters[1].value" value="name" />
</form>
def save() {
def attribute = Attribute.get(params.id)
attribute.properties = params
}
コレクションに正しく入力されますが、保存前にAttributeParameterがフェッチされていないため機能しません。そのため、エラーが発生して失敗します。
cascade = "all-delete-orphan"のコレクションは、所有するエンティティインスタンスによって参照されなくなりました:com.foo.Attribute.attributeParameters
アップデート:
HTMLを次のように変更しました。
<form>
<input type="hidden" name="attributeParameters.id" value="1" />
<input type="text" name="attributeParameters.value" value="1234567" />
<input type="hidden" name="attributeParameters.id" value="2" />
<input type="text" name="attributeParameters.value" value="name" />
</form>
そしてコントローラー:
params.list('attributeParameters').each {
def ap = AttributeParameter.get(it.id)
ap.value = it.value
ap.save()
}
これは機能します。私の唯一の懸念は、パラメーターが入る順序です。パラメーターがフォームに表示されるのと同じ順序で常にparamsオブジェクトに入る場合は、問題ないはずです。しかし、それらが異なって入ってくる場合は、間違ったAttributeParameterの値を変更している可能性があります。
したがって、パラメータが常に先入れ先出しであるという、より良い方法またはある種の検証を探しています。
更新2:
私はこの投稿に出くわしました、そしてそれは私が望むものです、しかし私はAttribute.attributeParametersをリストに変えることができません。彼らはセットとしてとどまる必要があります。