Grails 版本: 2.3.5
以下面的程式碼為例,
我們希望找到 author 之後,將 author 存回 book 中,
再呼叫 book 做 save(),
但實測發現 book 在 if 之前就已自動儲存,
book update
1
2
3
4
5
6
7
8
9
| def book = Book.get(params.id)
book.properties = params
def author = Author.findByName(params["author.name"])
if(author){
book.author = author
book.save()
}
|
查了一下 Grails API 找到 discard() 方法,用來避免自動執行儲存,
測試的程式碼如下,結果 book 仍然自動更新 (暈) ,
book update - test discard
1
2
3
4
5
6
| def book = Book.get(params.id)
book.properties = params
def author = Author.findByName(params["author.name"])
book.discard()
|
繼續 try 不同的組合後發現似乎是 findBy() 指令造成 book 自動儲存,
在此提供兩種解決方式,第一種是在 mapping params 之前先執行完 findBy() ,
book update - solution 1
1
2
3
4
5
6
7
8
9
| def author = Author.findByName(params["author.name"])
def book = Book.get(params.id)
book.properties = params
if(author){
book.author = author
book.save()
}
|
若因為處理邏輯的因素 findBy() 一定得在 book.properties = params 之後,
我們可以用第二種方式,使用 new Book(params) 來取代 book.properties = params 。
book update - solution 2
1
2
3
4
5
6
7
8
9
10
| def book = new Book(params)
def author = Author.findByName(params["author.name"])
if(author){
def book = Book.get(params.id)
book.properties = params
book.author = author
book.save()
}
|