2010-08-14 52 views
2

我正在做一個閱讀故事的網站。我的目標是將故事內容保存到多個頁面中以獲取列表,然後輕鬆分頁;我做了以下內容:Grails addTo in for循環

在域我創建了兩個域,Story

class Story { 

    String title 

    List pages 

    static hasMany=[users:User,pages:Page] 
    static belongsTo = [User] 

    static mapping={ 
     users lazy:false 
     pages lazy:false 

    } 
} 

而且Page

class Page { 
    String Content 
    Story story 
    static belongsTo = Story 
    static constraints = { 
     content(blank:false,size:3..300000) 
    } 

} 

控制器save操作是:

def save = { 
    def storyInstance = new Story(params) 
    def pages = new Page(params) 
    String content = pages.content 
    String[] contentArr = content.split("\r\n") 

    int i=0 

    StringBuilder page = new StringBuilder() 
    for(StringBuilder line:contentArr){ 
     i++ 
     page.append(line+"\r\n") 

     if(i%10==0){ 

       pages.content = page 
       storyInstance.addToPages(pages) 
       page =new StringBuilder() 
     } 
    } 

    if (storyInstance.save(flush:true)) { 
     flash.message = "${message(code: 'default.created.message', args: [message(code: 'story.label', default: 'Story'), storyInstance.id])}" 
     redirect(action: "viewstory", id: storyInstance.id) 
    }else { 
     render(view: "create", model: [storyInstance: storyInstance]) 
    } 
} 

(我知道它看起來很亂,但它是一個原型)

問題是,我正在等待storyInstance.addToPages(pages)每次條件爲真時向頁面集添加一個頁面實例。但究竟發生了什麼,它給了我最後一次只有最後一個page_idx。我認爲它會一頁一頁地保存頁面,這樣我就可以得到每個故事的頁面列表。

爲什麼會發生這種情況,是否有比我更簡單的方法呢?

任何幫助表示讚賞。

+0

看看http://stackoverflow.com/questions/3483664/grails-addto-in-for-loop/3484207#3484207 – Oleksandr 2010-08-14 16:47:31

回答

3

你只有一個頁面的工作...正確的解決辦法:

 def save = { 
     def storyInstance = new Story(params) 
     def i = 0 

     StringBuilder page = new StringBuilder() 
     for(StringBuilder line in params?.content?.split("\r\n")){ 
      i++ 
      page.append(line+"\r\n") 

      if(i%10 == 0){ 
        storyInstance.addToPages(new Page(content: page.toString())) 
        page = new StringBuilder() 
      } 
     } 

    if (storyInstance.save(flush:true)) { 
     flash.message = "${message(code: 'default.created.message', args: [message(code: 'story.label', default: 'Story'), storyInstance.id])}" 
     redirect(action: "viewstory", id: storyInstance.id) 
    }else { 
     render(view: "create", model: [storyInstance: storyInstance]) 
    } 
} 
+0

謝謝先生,我會盡快嘗試它,並會告訴你結果..不能告訴你我的感受:) – 2010-08-14 17:02:56

+0

它的工作先生..但有一種問題,我可以理解..它已被保存無序而我已經調試過,看到哈希集是不是按順序..所以什麼是錯的應該使用排序集...以及如何? – 2010-08-14 20:01:24

+0

使用默認的排序順序映射 - 看看這個http://www.grails.org/doc/latest/ref/Database%20Mapping/sort.html – Oleksandr 2010-08-14 22:44:19