我正在制作一个模型,其中document.addEventListener("click", myfunction, true);
填写了许多问卷,答案会保存到User
。我正在使用grails 2.5.2
测试1
所以我有两个模特
Questionresponse
通过上述操作,将创建一个新的数据库表:class User {
String username
...
static hasMany = [reponse: QuestionResponse]
}
class QuestionResponse {
String question_1
String question_2
...
}
,其中包含两列user_questionresponse
和user_questionresponses_id
。这看起来像我想要的。用户将有许多问题响应,这些关系将保存在此表中。但是,我无法找到如何将数据保存到此表。
例如,如果我这样做:
questionresponse_id
Test2(只需添加belongsTo)
def user = springSecurityService.currentUser
def questionnaire = new QuestionResponse(question_1: "foo", question_2: "bar")
//How do I link the user to this newly created questionnaire?
user.addToResponse(q).save(flush: true) //DOES NOT WORK.
如果我将class User {
String username
...
static hasMany = [reponse: QuestionResponse]
}
class QuestionResponse {
String question_1
String question_2
static belongsTo = [user: User]
...
}
添加到belongsTo
,则会在数据库中创建新列QuestionResponse
。现在,如果我运行与上面相同的代码,则此user_id
列的ID将填充当前用户的ID。但是,关系表user_id
仍为空。
我知道Burt提到的方法,但我认为只有ManyToMany关系才需要这样做。如果所有关系都需要,那么为什么不是默认值?
答案 0 :(得分:1)
在您的第一种情况下,您在User和QuestionResponse之间存在OneToMany关系,没有任何一方是该关系的所有者。在这种情况下,为了维护User和QuestionResponse之间的关系,需要第三个表。要保留数据,您需要执行以下操作:
userInstance.addToResponse(new QuestionResponse(question_1: "foo", question_2: "bar")).save(flush: true, failOnError: true)
您正在执行user.addToReponse(q)
而应该是user.addToReponse(questionnaire)
,如果它不是拼写错误并且数据实际上没有存储,则通过添加failOnError
参数进行检查以保存()方法。有时grails save()方法会无声地失败,它应该告诉你是否是这种情况。
在第二种情况下,您已将父级添加到关系中,这意味着您不需要第三个表来维护关系。在这种情况下,Grails不会创建和填充第三个表。
答案 1 :(得分:0)
第二种方法(在QuestionResponse中添加belongsTo)似乎是正确的做法,因为如果没有用户,QuestionResponse对象不能存在,并且不能属于不同的用户。
在这种情况下,不需要使用第三张表。
第一次运行应用程序时,grails创建了关系表(因为没有belongsTo)。当您使用belongsTo grails再次运行应用程序时,添加user_id字段但不会删除关系表。这就是为什么表是空的并且是空的:它不是必需的,但是grails数据库自动更新功能只会添加东西,它不会删除任何内容。
这同样适用于字段:如果从实体中删除字段,则必须手动将其从数据库中删除。