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

在Grails中设置关系有更好的方法吗?,grails,constructor,Grails,Constructor,我开始学习Grails,所以这可能是一个noob问题。我的怀疑很简单,虽然我已经搜索过了,但找不到我正在寻找的asnwer 问题是: 我有一个域类,它与我拥有的另一个域类有关系,如下所示: class Class3 { static belongsTo = [class1:Class1] (...) } class AddressController { def save() { def address = new Address(params)

我开始学习Grails,所以这可能是一个noob问题。我的怀疑很简单,虽然我已经搜索过了,但找不到我正在寻找的asnwer

问题是:

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

class Class3 {

    static belongsTo = [class1:Class1]

    (...)
}
class AddressController {

   def save() {
     def address = new Address(params)
     address.save()
   }
}
我正在我的控制器中创建一个操作,它从我的Class3接收一个JSON对象。在这个JSON中,我有一个class1对象的ID

问题是:我如何正确地创建Class3的实例,初始化它的class1属性,只拥有class1的Id而不是它的实际实例

我现在可以像这样查找
Class1.get(parsed_id)
(这就是我现在正在做的事情,它正在工作):

这就是我的json的样子:

{class1:{id:1} (...)}
但我认为在DB中查找class1的这个实例来初始化我的class3关系并将其保存在DB中会有一点开销。有更好的方法吗?例如,将class1的外键直接保存在我的class3中的DB中,不需要额外的
选择


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

我不确定您在JSON方面做了什么,但一般来说,这很容易。最基本的是以下几点。假设您要创建属于特定用户的新地址:

<form>
  <input type="hidden" name="user.id" value="${user.id}" />
  <label>street:</label>
  <input type="text" name="street" />
  ....
</form>
将表单传递到控制器时,它将传递一个参数映射,其中一个参数是:

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

address.save()

belongsTo关系已经建立。

所以目标是不执行“select class1”?理想情况下,在Ruby on Rails中,我可以实现这一点,因为class3对象将有一个属性
class1\u id
,我可以设置和保存。我不知道Grails是否有类似的东西Grails有类似的概念“ClassID”,但是它是只读的。我尝试了一些东西,但都没用。谢谢你的尝试。也许这是不可能的谢谢你的回答。是的,我在控制器中生成的
create()
方法中看到了这一点。问题是这个类似构造函数的(
newaddress(params)
)与来自
HTML
表单的
params
一起工作。我甚至尝试在构造函数中使用JSON,但没有成功。问题是,如果我错了,请纠正我,代码不起作用。OP希望避免使用select语句,在您的情况下,
User
。您是对的,@James Kleeh。代码现在确实可以工作了,但我的问题是,是否有一种方法可以避免在DB中选择只设置关系。我编辑了我的问题,以提供更多关于JSON的信息。在我的代码示例中,没有从数据库加载用户。它不需要取回。保存地址时,我从未获得用户信息。问题是,您的代码假定
地址
对象来自HTML表单。这不适用于JSON->
def address=new address(params)
address.save()