【发布时间】: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 如果entry 是null。基本上:
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 和 _entry 在 beforeValidate() 中都是 null,尽管我打印并验证了 params 包含控制器中的两个键。我不明白为什么会这样。我向params 添加新密钥是如何导致空值到达域类的?
接下来的问题当然是,让脚手架的 Create Entries 表单接受管道分隔的 String 并将其放入数据库的正确方法是什么?
【问题讨论】:
标签: grails grails-orm grails-2.0 grails-domain-class grails-controller