我有一个Note
域类,保存新笔记时,我需要为其创建一个NoteEvent
,以备后代记录该笔记已创建。 Note
包含一个NoteEvents
的集合,每个NoteEvent
跟踪其所属的Note
。Note
类:
class Note {
String noteText
Date dateCreated
static hasMany = [events : NoteEvent]
}
NoteEvent
类:class NoteEvent {
Date dateCreated
String type
static belongsTo = [note : Note]
}
为了在创建便笺时处理新的
NoteEvents
的保存,我使用了afterInsert
,因为我要在各处保存便笺实例(每次保存一个便笺后要使用特定的事件创建代码都是重复的且耗时的新注释),并且beforeInsert
显然还没有处理Note
的持久实例-NoteEvent
将没有任何东西作为其note
。所以现在我的
Note
类是:class Note {
String noteText
Date dateCreated
static hasMany = [events : NoteEvent]
def afterInsert = {
def event = new NoteEvent(type: "CREATED")
addToEvents(event)
save()
}
}
但是,当其中一个便笺被更新时,我还需要创建一个
NoteEvent
,这是混乱和沮丧和严重缺乏咖啡的地方。要在更新后的便笺上附加一个新的“更新后的” NoteEvent
,我非常聪明决定再次使用afterUpdate
,以避免每次我需要更新Note
实例时将事件创建代码散布到整个应用程序中。所以现在,对于
Note
,我有:class Note {
String noteText
Date dateCreated
static hasMany = [events : NoteEvent]
def afterInsert = {
def event = new NoteEvent(type: "CREATED")
addToEvents(event)
save()
}
def afterUpdate = {
def event = new NoteEvent(type: "UPDATED")
addToEvents(event)
save()
}
}
要将新事件添加到笔记的集合中,我正在使用动态
addTo()
方法,然后需要实例的save()
。但是,在“after”事件的情况下,这是对save()
的第二次调用。因此,当我第一次保存一个新实例并调用afterInsert
时,刚刚保存的实例会立即再次保存,这会触发afterUpdate
事件,现在我有两个note事件:“创建”事件是我刚刚创建的事件保存便笺,并且从“创建”便引起便笺再次保存时的“更新”便笺。我不清楚在这种情况下如何使用“之前”事件会有所帮助。我还能怎么做?
最佳答案
您实际上可以使用beforeInsert
和beforeUpdate
方法。这是因为addTo*
方法不需要Note
作为持久实例。
保存NoteEvent
时将保存Note
,因为在将NoteEvent
保存到Note
方法中之前先添加了beforeUpdate
。查看 addTo*
docs以获得更详细的说明。
我能够同时获得以下两个Note
类,以使它们相信您希望它们起作用。我确实遇到了一个问题,当更新Note
时,将添加两个NoteEvent
对象。我能够通过确保 Controller 的更新方法使用noteInstance.save()
而不是noteInstance.save(flush:true)
来解决此问题。
class Note {
String noteText
Date dateCreated
static hasMany = [events : NoteEvent]
def beforeInsert = {
def event = new NoteEvent(type: "CREATED")
addToEvents(event)
}
def beforeUpdate = {
def event = new NoteEvent(type: "UPDATED")
addToEvents(event)
}
}
如果您想要一个更精简的版本,
addTo*
方法知道要添加的对象类型,您可以使用Map
的NoteEvent
构造函数class Note {
String noteText
Date dateCreated
static hasMany = [events : NoteEvent]
def beforeInsert = {
addToEvents(type: "CREATED")
}
def beforeUpdate = {
addToEvents(type: "UPDATED")
}
}