假设我有两个域:
class Country {
String name
String Desc
static hasMany = [organizations: Organization]
}
class Organization {
String name
Country country
static belongsTo = [country:Country]
}
注意:如果是创建组织,国家/地区将列在组合框中。
假设我的数据库中有4行,我从bootstrap中获取了该行。
**Name** **Desc**
US USA
CA CAN
NP NEP
IN IND
我想在创建组织时将USA指定为默认值。有没有办法从域级别而不是gsp?
答案 0 :(得分:0)
我认为load method是你最好的选择,虽然它要求你知道你想成为默认实例的id。硬编码这不是一个好主意,因为它可能会在未来发生变化。但是你可以在应用程序启动时查找并保存id,例如
class BootStrap {
def grailsApplication
def init = {
def usa = Country.findByName('US')
grailsApplication.config.COUNTRY_US_ID = usa.id
}
}
使用您想要的任何配置键。
然后更改Organization
类以在其构造函数中调用load
:
import grails.util.Holders
class Organization {
Organization() {
if (Holders.config.COUNTRY_US_ID) {
country = Country.load(Holders.config.COUNTRY_US_ID)
}
}
String name
static belongsTo = [country:Country]
}
请注意,我删除了Country country
属性,因为它是多余的;添加belongsTo
创建一个与地图键(“country”)同名并且与地图值(Country)具有相同类型的属性。拥有它并没有什么坏处,但它不是必需的。
这里load
合适的原因是,在访问id
以外的持久属性之前,它不会访问数据库。因此,如果需要,您可以将其配置为懒惰地检索实例,但如果使用其他实例覆盖该值,则不会浪费数据库查找初始填充。打开SQL日志记录以验证这一点。