问题在于将 a 链接Event Instance
到 a 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被保存到一个Tag 实例中,但是对于同一个用户重复使用相同的标签是有问题的,因为它需要有可能具有多个相关的事件 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 个标签 SEE DATABASE SCREENSHOT,然后使用同一用户创建了第二个事件,并使用了之前在最后一个事件t1和t5中创建的两个标签)