我有以下域:
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 更改为列表。他们需要保持作为一个集合。