grails:如何正确编辑/更新集合?

时间:2014-07-21 16:17:52

标签: grails

我只是浪费了半天试图解决这个问题,阅读了一些解决方法,并且认为“它不会那么糟糕 - 在Grails编辑集合时必须要直截了当,使用脚手架视图或我的自己的“。

假设我有这个域名对象:

class TreeGroup {
    String name
    List<Tree> trees      

    static hasMany = ['trees': MyTree]
}

只是为了解释数据结构的选择 - 我需要我的记录是唯一的,但按照我设置的顺序。这就是我选择List的原因,AFAIK不能依赖于Set中的顺序。所以这个问题有2个部分 - 1)如何从任何Collection中删除,例如Set,2)是List在这个上下文中保留Set的最佳替代(保留顺序)。

我希望能够创建一个没有树的组记录并进行4次更新:

  • 编辑/保存
  • 编辑组记录以引用2棵树A和B
  • 添加另一棵树C
  • 删除A
  • 删除B和C

显然,我希望每一步都能达到理想状态。目前,我只能添加记录,如果我甚至编辑/保存到列表,列表元素会再次添加到列表中。

我正在使用多重选择标记。它看起来像这样:

<g:select name="trees" from="${allTrees}" optionKey="id" 
          multiple="true" class="many-to-many"
          value="${trees ? trees*.id : treeGroupInstance?.trees*.id}" />

这很好,从某种意义上说,它会在更新时生成带有这些变量的HTTP头:

_method:PUT
version:19
name:d5
trees:1
_action_update:Update

但数据绑定器只添加新元素,它永远不会让你编辑列表。

最干净的方法是什么?是我,不是阅读明显的东西,还是这是grails数据绑定的设计缺陷(以及何时/如何修复)?

是否有一种方法可能通过隐藏的HTTP参数在(重新)添加元素之前清除列表?

由于

1 个答案:

答案 0 :(得分:1)

我最终这样做了:

private repopulate(def domainObject, String propertyName, Class domainKlaz) {
    if (params[propertyName] != null) {
        domainObject[propertyName].clear()
        domainObject[propertyName].addAll(
              params[propertyName].collect { domainKlaz.get(it) }
        )
    }
}

我在save()之前的更新控制器方法中为每个集合调用它。 OMG多么丑陋。