在 grails 中设计具有常量的域的最佳方法
Best way to design Domain with constant in grails
我的项目中有很多域 类。其中许多都有类型列。例如:User
table 有 userType
列,Book
table 有 bookType
列。我经常通过调用 BookType.list()
方法将这些类型传递到 GSP g:select
源中。但问题是如果 GSP 包含很多 g:select
那么我必须执行很多冗余查询。
另一个问题是当我创建一个新的域实例时,我必须通过以下方式从数据库中获取这些常量类型
Book book = new Book();
book.bookType = BookType.findByName(BookTypes.COMICS);
这里我也遇到了同样的问题,不得不执行冗余查询。有什么好的设计可以在不执行这些冗余查询的情况下完成所有这些工作吗?
如果 types
不是很活跃,我认为是这种情况,因为我可以看到您为类型定义了一个 enum
。完全尝试使用 enum
——我的意思是,根本不用数据库 table 来备份它。例如,
enum SomeType {
TYPE1(1, "Type 1"),
TYPE2(2, "Type 2"),
TYPE3(3, "Type 3")
final int id
final String value
private SomeType(int id, String value) {
this.id = id
this.value = value
}
// Might be needed for <g:select> tags, I'm not very sure
int getKey() { id }
static SomeType byId(int id) {
values().find { it.id == id }
}
}
然后,在您的域中,执行类似的操作,
class SomeDomain {
static constraints = {
...
type nullable: false
...
}
...
SomeType type
}
然后,你可以简单地做这样的事情,
SomeDomain book = new SomeDomain(..., type: SomeType.TYPE1, ...);
我的项目中有很多域 类。其中许多都有类型列。例如:User
table 有 userType
列,Book
table 有 bookType
列。我经常通过调用 BookType.list()
方法将这些类型传递到 GSP g:select
源中。但问题是如果 GSP 包含很多 g:select
那么我必须执行很多冗余查询。
另一个问题是当我创建一个新的域实例时,我必须通过以下方式从数据库中获取这些常量类型
Book book = new Book();
book.bookType = BookType.findByName(BookTypes.COMICS);
这里我也遇到了同样的问题,不得不执行冗余查询。有什么好的设计可以在不执行这些冗余查询的情况下完成所有这些工作吗?
如果 types
不是很活跃,我认为是这种情况,因为我可以看到您为类型定义了一个 enum
。完全尝试使用 enum
——我的意思是,根本不用数据库 table 来备份它。例如,
enum SomeType {
TYPE1(1, "Type 1"),
TYPE2(2, "Type 2"),
TYPE3(3, "Type 3")
final int id
final String value
private SomeType(int id, String value) {
this.id = id
this.value = value
}
// Might be needed for <g:select> tags, I'm not very sure
int getKey() { id }
static SomeType byId(int id) {
values().find { it.id == id }
}
}
然后,在您的域中,执行类似的操作,
class SomeDomain {
static constraints = {
...
type nullable: false
...
}
...
SomeType type
}
然后,你可以简单地做这样的事情,
SomeDomain book = new SomeDomain(..., type: SomeType.TYPE1, ...);