0

问题在于将 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,然后使用同一用户创建了第二个事件,并使用了之前在最后一个事件t1t5中创建的两个标签

4

2 回答 2

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)
}
于 2013-01-08T05:28:18.240 回答
0

[因此,您正在创建一个事件,并且您可能需要随之创建新标签。

所以为了让你也保存到标签,你必须在标签类上定义一个belongTo:

class Tag {
...
static belongsTo = [Event, User]
}

现在你可以说:

Event event = new Event(...)
event.addToTags( new tag(...) )

并且event.save()还应该保存您的新标签。

编辑:您new Tag可能应该类似于Tag.findOrCreateByUserAndTag(user, name). 如果标签已经存在,这将找到它,如果不存在,它将创建它。显然用您正在使用的内容替换用户和名称变量。

于 2013-01-08T05:46:46.847 回答