有没有更好的方法在Grails中设置关系?

时间:2013-09-03 15:25:02

标签: grails constructor

我开始学习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对象初始化对象的方法吗?

1 个答案:

答案 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关系。