2013-09-25 76 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