【问题标题】:Modify params before saving domain object在保存域对象之前修改参数
【发布时间】:2013-01-09 23:33:38
【问题描述】:

我需要一个包含Strings 列表的域类。众所周知,GORM 无法处理这个问题,所以我已经解决了这个问题。起初我尝试在域类中使用 getter 和 setter,但这会导致问题。然后我在 Stack Overflow 上找到了一种使用afterLoad()beforeValidate() 重写属性的方法,如下所示。这让我可以将List 转换为String 以保持持久性并返回List 以在应用程序中使用。

    class Entries {
        // persisted to database
        String _entry

        // exposed to app
        List entry

        static transients = ['entry']   //don't try to persist the List

        def afterLoad() {
                            // split the String from the database into a List
            entry = _entry?.split('\\|')
        }

        def beforeValidate() {
                            // join the List into a String for persisting
            _entry = entry.join('|')
        }

        static constraints = {
            _entry maxSize:4000
        }
    }

这以编程方式运行良好。唯一的问题是 Grails 脚手架无法处理这个问题,即使我尝试输入管道分隔的字符串。我理解脚手架为_entry 创建表单字段的原因,因此entry 在尝试保存对象时为空。 beforeValidate() 依赖于一个字符串列表来工作。

在调用new Entries(params) 之前,我试图通过在控制器中设置params.entry = params._entry 来解决这个问题。 [我认识到这不是一个完美的解决方案,但这是我第一次让表单工作。] 然后我在beforeValidate() 中添加了一个测试来设置entry = _entry 如果entrynull。基本上:

EntriesController.groovy:

params.entry = params._entry    // I added this line
def entriesInstance = new Entries(params)

Entries.groovy:

    def beforeValidate() {
        if( entry == null ) entry = _entry    // I added this line
        _entry = entry.join('|')
    }

我认为这将允许我将管道分隔的字符串输入脚手架的创建条目表单并将 something 输入数据库。

但令我惊讶的是,我发现 entry_entrybeforeValidate() 中都是 null,尽管我打印并验证了 params 包含控制器中的两个键。我不明白为什么会这样。我向params 添加新密钥是如何导致空值到达域类的?

接下来的问题当然是,让脚手架的 Create Entries 表单接受管道分隔的 String 并将其放入数据库的正确方法是什么?

【问题讨论】:

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


    【解决方案1】:

    我需要一个包含字符串列表的域类。众所周知,GORM 无法处理这个问题,所以我已经解决了这个问题。

    我不同意你的观点

    class Xyz {
    
    static hasMany = [entries: String]
    
    }
    

    应该创建一个单独的表来保存您的字符串列表(它实际上是一个集合)。这里是docs

    【讨论】:

    • 嗯,很高兴知道这一点。显然,我正在查看过时的信息。不过,我看到脚手架无法处理这个问题。有解决方法吗?感谢您引起我的注意,我会投票赞成您的回答。但我仍然想回答我的问题,因为我不明白 params 数组发生了什么。
    • 我也不明白,但是期望任何人尝试复制您上面的无意义代码是不合理的。
    • (感谢您的关注。只有两个这样的期望,我获得了不合理的徽章。)为什么这是荒谬的?对我来说,这似乎是一个合理的问题。即使 hasMany 方法避免了这个问题,我仍然希望能够操纵 pa​​rams 映射并让它工作。我想知道为什么没有。
    • 这很荒谬,因为它是一个 hack。当您遵循 Grails 设置的约定时,Grails 工作得非常好。一旦你偏离了这一点,你就会很难过。我的观点是,我无法立即看出为什么您的代码不起作用,因此期望任何人使用您的代码创建一个新项目并尝试复制它是不现实的。
    • 我的问题与黑客无关。 hack 可能是我发现问题的方式,但我想了解为什么对 Controller 中的 params 数组的更改不会影响到域。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-06
    • 1970-01-01
    • 2014-05-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多