我开始学习Grails,所以这可能是一个菜鸟问题。我的疑问非常简单,虽然我已经搜索过,找不到我正在寻找的asnwer。
问题在于:
我有一个与我拥有的另一个域类有关系的域类,如下所示:
class Class3 {
static belongsTo = [class1:Class1]
(...)
}
我正在我的控制器中创建一个动作,它从我的Class3接收一个JSON对象。在这个JSON中,我有一个我的class1对象的ID。
问题是:我如何正确创建Class3的实例,初始化它的class1属性,只有class1的Id而不是它的实际实例?
我现在可以像这样找Class1.get(parsed_id)
(这就是我现在正在做的,而且它正在发挥作用):
def jsonObj = request.JSON
def class3 = new Class3(class1: Class1.get(jsonObj.class1.id) (...))
class3.save(flush: true)
这就是我的json的样子:
{class1:{id:1} (...)}
但是我认为在DB中查找class1实例来初始化我的class3关系并将其保存在我的数据库中是一个小小的开销。有一个更好的方法吗?比如,在我的class3中将class1的外键直接保存在DB中,而没有额外的SELECT
?
或者它有一种从JSON对象初始化对象的方法吗?
答案 0 :(得分:2)
我不确定你在json方面做了什么,但一般来说,这很容易。最基本的将是以下内容。假设您要创建属于特定用户的新地址:
<form>
<input type="hidden" name="user.id" value="${user.id}" />
<label>street:</label>
<input type="text" name="street" />
....
</form>
当您提交上述表格时,控制器可能如下所示:
class AddressController {
def save() {
def address = new Address(params)
address.save()
}
}
当表单传递给控制器时,它会传递一个params地图,其中一个是:
user.id: 1234
因此,Grails将自动在Address对象上设置ID为1234的User实例。所以当你这样做时:
address.save()
已建立belongsTo关系。