1

我开始学习 Grails,所以这可能是一个菜鸟问题。我的疑问很简单,尽管我已经搜索过但找不到我正在寻找的答案。

这是问题所在:

我有一个域类与我拥有的另一个域类有关系,如下所示:

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 关系并将其保存在我的 DB 中有点开销。有一个更好的方法吗?就像,将class1的外键直接保存在我的class3中的DB中,没有额外的SELECT

或者它可能有一种从 JSON 对象初始化对象的方法?

4

1 回答 1

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()
   }
}

当表单传入控制器时,它会传入一个参数映射,其中之一是:

user.id: 1234

因此,grails 将自动在 Address 对象上设置 ID 为 1234 的 User 实例。所以当你这样做时:

address.save()

belongsTo 关系已经建立。

于 2013-09-03T17:01:04.230 回答