2013-09-25 146 views
3

我很难在Grails中自动绑定一对多关系,而无需在控制器中使用一些hack。我明白,Grails中的一对多关系是一个无序的集合,它以某种方式影响绑定。自动绑定Grails一对多关系

当我保存此表格时,有时数据会正确保存,有时却不会。如果一个作者有3-4本书,它似乎不太经常。

在这个例子中,我试图删除所有不相关的代码来说明问题。

型号:

class Author { 
    String name 
    static hasMany = [ books:Book ] 
} 

class Book { 
    String title 
    static belongsTo = [ author:Author ] 
} 

查看:

<g:form method="post" class="form-horizontal"> 
    <g:hiddenField name="id" value="${authorInstance?.id}" /> 
    <g:hiddenField name="version" value="${authorInstance?.version}" /> 
    <g:textField name='name' value='${authorInstance?.name}'/> 
    <g:each var="book" in="${authorInstance.books}" status="i"> 
     <g:hiddenField name='book[${i}].id' value='${book.id}'/> 
     <g:textField name='book[${i}].title' value='${book.title}'/> 
    </g:each> 
    <g:actionSubmit action="update" value="Update" /> 
</g:form> 

控制器:

def update(Long id, Long version) { 
    def author = Author.get(id) 

    // removed "Not Found" and "Version" validation for this example 

    author.properties = params 

    if (!author.save(flush: true)) { 
     render(view: "edit", model: [author: author]) 
     return 
    } 

    flash.message = "Success" 
    redirect(action: "list" 
} 

我怎样组织我的模型和视图这样我就可以离开控制器相对不变?

回答

0

我发现,最容易做的事情是力“书”,所以它的命令是一个列表。

class Author { 
    List books <------- Added (by default this one-to-many relationship is a Set) 
    String name 
    static hasMany = [ books:Book ] 
} 

然后视图可以保持不变,一切都应按预期工作。

2

我一直在提交一对多形式的类似问题。我在我的应用程序中通过将套件转换为包来解决它。

所以,除非你特别需要books是一套,试试这个:

class Author { 
    String name 
    Collection<Book> books 
    static hasMany = [ books:Book ] 
} 
+0

感谢您的评论,它帮助我找到了正确的解决方案。 – arcdegree