问题在于将Event Instance
连接到Tag Instance
。当保存时,一个已经完成的事件…但是设计问题仍然存在,因为一个标签可以与多个事件相关,一个事件可以有0到多个标签。
在标准save()
方法中,我在方法tagInput()
中调用,该方法从形式tagsCollection field
(参见截图)中获取字符串,该字符串将单词和分开,并创建/保存 Tag
的实例(参见下面的方法)。每个分离的值都链接到登录的用户,现在链接到事件。
总体问题是我如何添加多个事件实例id到创建的每个标签,以便标签数据库中的event_id不会被使用相同标签名称的新事件覆盖。
用逗号&网页上标签的结果&数据库:dbconsole
用户类 (用于Grails安全插件)
static hasMany = [tags : Tag]
标签类 (用于标签云Grails插件)
String tag
int times
User user
// Think this needs changing to hasMany i.e. many tags, many events linked to a tag
static belongsTo = [event: Event]
事件类String tagsCollection
User user
static hasMany = [tags: Tag]
.
所以现在一个事件id被保存到一个标签实例,但是对于同一个用户重复使用相同的标签是有问题的,因为它需要有多个相关事件id的搜索能力的可能性。
def tagInput(Event e) {
//Stores tags sperated via comma in an array from the eventInstance tagCollection string field
def tagArray = e.tagsCollection.replaceAll("\s+","").toLowerCase().split(",")
tagArray.each { aVar ->
def splitTag = Tag.findByTag(aVar)
//If the tag already exists for the current user logged in
if (Tag.findByTag(aVar) && splitTag.userId == lookupPerson().id) {
//Lookup person spring security method
//+1 to how many times that tag has been used
splitTag.times++
//TODO IMPLEMENT A WAY TO APPEND EVENT ID TO TAG EVENT_ID FIELD
splitTag.save(flush: true, failOnError: true)
} else {
//if tag doesn't exist, create a new one using current logged in user
def nTag = new Tag(tag:aVar, times: 1, user:lookupPerson())
//SUGGESTION to save event id to a tag
e.addToTags(nTag)
e.save()
//Set a user to own this tag
def u = User.find(lookupPerson())
nTag.save(flush: true, failOnError: true)
u.addToTags(nTag)
u.save()
}
}
}
(为了测试,我使用一个用户,与第一个事件谁创建了5个标签见数据库截图,然后创建了第二个事件与相同的用户,并使用两个标签先前创建在最后一个事件t1 & t5)
[所以你正在创建一个事件,你可能需要为它创建新的标签。
所以为了保存级联到标签上,你必须在标签类上定义一个belongTo:
class Tag {
...
static belongsTo = [Event, User]
}
现在你可以说:
Event event = new Event(...)
event.addToTags( new tag(...) )
和event.save()
也应该保存你的新标签。
编辑:你的new Tag
应该是类似Tag.findOrCreateByUserAndTag(user, name)
。如果标签已经存在,它将找到它,如果不存在,它将创建它。显然,将用户和名称变量替换为您正在使用的变量。
how can I add an event instance id to each of the tags created, when the id hasn't been created yet ...
你不能,你也不需要这么做。根据定义,标记实例不需要Event实例引用,因为域类中不包含Event属性。
因此,您可以创建标记实例并保存它,而不需要事件实例持久化:只需从tagInput()
方法返回保存的tagInstances列表。回到save()方法中,在保存eventInstance之后,用如下方式添加标签列表:
tagInstancesList.each{tagInstance->
eventInstance.addToTags(tagInstance)
}