问题在于将Event Instance
与Tag Instance
相关联。在保存时, 现已实现 ...但仍有设计问题,因为一个标记可能与多个事件相关,并且一个事件可以有0到多个标签。
在标准save()
方法中,我在方法tagInput()
内调用,该方法从tagsCollection field
(参见屏幕截图)中获取字符串,该字符串将单词和创建/保存 Tag
的实例(请参阅下面的方法)。每个分隔的值都链接到登录用户,现在链接到事件事件。
总体问题是如何将多个事件实例ID添加到每个创建的标记中,以便Tag数据库中的event_id不会被使用相同标记名称的较新事件覆盖。
Demo of multiple tags separated via comma& Result of tags on webpage& Database: dbconsole
用户类(与Grails安全插件一起使用)
static hasMany = [tags : Tag]
标记类(用于Tag Cloud 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 )
答案 0 :(得分:0)
how can I add an event instance id to each of the tags created, when the id hasn't been created yet ...
你不能,而且你也不需要这样做。根据定义,Tag实例不需要Event实例引用,因为域类中不包含Event属性。
因此,您可以创建标记实例并在不保留事件实例的情况下保存它:只需从tagInput()
方法返回已保存的tagInstances列表。回到save()方法,保存eventInstance后,用这样的东西添加标签列表:
tagInstancesList.each{tagInstance->
eventInstance.addToTags(tagInstance)
}
答案 1 :(得分:0)
[所以你要创建一个事件,你可能需要随之创建新的标签。
因此,为了保存级联到标记,您必须在标记类上定义belongsTo:
class Tag {
...
static belongsTo = [Event, User]
}
现在你可以说:
Event event = new Event(...)
event.addToTags( new tag(...) )
event.save()
也应保存新标记。
修改:您的new Tag
应该类似于Tag.findOrCreateByUserAndTag(user, name)
。这将找到标签,如果它已经存在,如果它不存在,它将创建它。显然用您正在使用的内容替换用户和名称变量。