我创建了两个名为Asset and Tag的域名类。资产可以有很多标签
// Asset.groovy
class Asset {
static hasMany = [tags: Tag]
}
// Tag.groovy
class Tag {
static belongsTo = Asset
String word
}
将标签输入视图中的文本字段,每个标记用逗号分隔。
提交资产表单后,AssetController将使用Tag.findOrSaveWhere
创建新标记或Asset.addToTag
def tags_list = params?.tags?.split(",")
tags_list.each {
def tag = Tag.findOrSaveWhere(word: it.trim())
assetInstance.addToTags(tag)
}
所有这些都很有效,但如果用户更新并删除了标签,我试图从资产中删除标签。
如何在更新时删除标签?
编辑我通过采用旧方法删除所有标记然后尝试保存资产实例来进一步解决这个问题。
assetInstance.tags.clear()
def tags_list = params?.tags?.split(",")
tags_list.each {
def tag = Tag.findOrSaveWhere(word: it.trim())
assetInstance.addToTags(tag)
}
但是,如果Tags为null,则会抛出异常。换句话说,如果我删除所有标签,则保存失败。
答案 0 :(得分:0)
解决了我的问题。清除更新操作中的标记是正确的,但我必须注意表单中的空标记字符串。
我的最终结果是AssetController
assetInstance.tags.clear()
def tags_list = params?.tags?.split(",")
tags_list.each {
def tag = Tag.findOrSaveWhere(word: it.trim())
if (tag.id != null) // to prevent null id exceptions
assetInstance.addToTags(tag)
}