【问题标题】:Grails - how execute code before every save?Grails - 如何在每次保存之前执行代码?
【发布时间】:2012-06-03 20:24:16
【问题描述】:

在每次对域类调用 save() 之前,是否有一种好的/标准方法来执行一些通用代码?

例如,我的域

class Page {

    String url
    Boolean processed
    Date date
    Integer urlCrc 
}

我的表单只有 3 个第一个字段,我想在每次调用 save() 方法时计算 urlCrc。我不能只覆盖 save 方法,因为它是注入的。

【问题讨论】:

    标签: grails grails-orm grails-domain-class


    【解决方案1】:

    您可以使用 GORM 事件 - 请参阅 docs。因为默认情况下 validate() 在每个 save() 之前被调用,所以我会使用它。

    class Page {
        //your defs here
    
        def beforeValidate() {
            this.urlCrc = yourComputationHere
        }
    }
    

    【讨论】:

    • 谢谢,它有效。不幸的是 grails.org 已经关闭,由于一些路由问题grails.1312388.n4.nabble.com/… 所以我需要在这里询问
    • 上述解决方案可能是最好的,但另一种选择是使用 grails 计算字段。请参阅文档。
    • 如果你想在保存前执行代码使用beforeUpdate() / beforeInsert()。如果你使用beforeValidate(),那么当你调用validate()时它总是被调用(方法save()在保存之前调用'validate()')。因此,即使您不保存代码,它也会在验证之前执行。
    【解决方案2】:
    class Page {
        def beforeInsert() {
            this.beforeUpdate()
        }
        def beforeUpdate() {
            this.urlCrc = 'calculate something'
        }
    }
    

    【讨论】:

    • 你能链接到这方面的文档吗?
    • 是的,这是documentation
    【解决方案3】:

    GORM 文档中涵盖了该主题:

    6.5 高级 GORM 功能

    6.5.1 Events and Auto Timestamping

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-08
      • 2014-12-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-03-26
      • 2016-12-25
      • 2015-07-01
      相关资源
      最近更新 更多