【问题标题】:Grails addTo in for loopGrails addTo 在 for 循环中
【发布时间】:2010-08-14 14:08:27
【问题描述】:

我正在做一个阅读故事的网站。我的目标是将故事的内容保存到几页中以获取列表,然后轻松地对其进行分页;我做了以下事情:

在域中我创建了两个域,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。我认为它会一页一页地保存页面,这样我就可以获得每个故事的页面列表。

为什么会发生这种情况,有没有比我做的更简单的方法?

感谢任何帮助。

【问题讨论】:

标签: grails


【解决方案1】:

您只使用一页...正确的解决方案:

     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])
    }
}

【讨论】:

  • 谢谢您,先生,我会尽快尝试并告诉您结果.. 无法告诉您我的感受 :)
  • 它有效,先生..但有一些我能理解的问题..当我调试它并看到哈希集不正常时,它被无序保存..那是什么错了我应该使用排序集..以及如何?
  • 使用默认排序顺序映射 - 看看这个grails.org/doc/latest/ref/Database%20Mapping/sort.html
  • 是的,我尝试过..我在页面域上设置 createdDate 每次都有新日期,并按它从故事域中排序,但什么也没发生
  • 尝试调试 HQL 查询。将休眠日志设置为 true 并查找从数据库中选择页面的查询
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-18
  • 2015-01-28
相关资源
最近更新 更多