有没有办法在grails中创建与任意域对象的关联?
像
这样的东西class ThingHolder {
DomainObject thing;
}
然后
Book b=new Book(title: "Grails 101").save()
Author a=new Author(name: "Abe").save()
ThingHolder t1=new ThingHolder(thing:b).save()
ThingHolder t2=new ThingHolder(thing: a).save()
那样
ThingHolder.get(t1.id).thing // will be a Book
和
ThingHolder.get(t2.id).thing // will be an Author.
答案 0 :(得分:1)
我仍然在寻找一种粗略的方式来做这件事,但这似乎完成了工作。
class ThingHolder {
static constraints = {
thing bindable:true // required so 'thing' is bindable in default map constructor.
}
def grailsApplication;
Object thing;
String thingType;
String thingId;
void setThing(Object thing) { //TODO: change Object to an interface
this.thing=thing;
this.thingType=thing.getClass().name
this.thingId=thing.id; //TODO: Grailsy way to get the id
}
def afterLoad() {
def clazz=grailsApplication.getDomainClass(thingType).clazz
thing=clazz.get(thingId);
}
}
假设您有一个Book and Author(不会覆盖域对象的ID属性)。
def thing1=new Author(name : "author").save(failOnError:true);
def thing2=new Book(title: "Some book").save(failOnError:true);
new ThingHolder(thing:thing1).save(failOnError:true)
new ThingHolder(thing:thing2).save(failOnError:true)
ThingHolder.list()*.thing.each { println it.thing }
我在这两个答案中找到了一些非常有用的提示。
How to make binding work in default constructor with transient values.
How to generate a domain object by string representation of class name
答案 1 :(得分:0)
更新(根据评论)
由于您不想(或不能)在您的域模型中扩展另一个类,因此使用GORM不可能实现这一目标。
原始回答
是的,你可以这样做。它被称为继承。在您的情况下,您将拥有Thing
,这是Author
和Book
的超类。
您的域名模型可能如下所示:
class Thing {
// anything that is common among things should be here
}
class Author extends Thing {
// anything that is specific about an author should be here
}
class Book extends Thing {
// anything that is specific about a book should be here
}
class ThingHolder {
Thing thing
}
由于Author
和Book
都延伸Thing
,因此它们也被视为Thing
。
但是,在不了解继承以及Grails / GORM如何为数据库中的数据建模的情况下执行此操作是短视的。你应该完全研究这些话题,以确保这真的是你想要的。