2012-06-03 29 views
7

Có cách nào tốt/tiêu chuẩn để thực thi một số mã phổ biến trước mỗi lần gọi save() trên các lớp miền không?Grails - cách thực thi mã trước mỗi lần lưu?

Ví dụ, tên miền của tôi

class Page { 

    String url 
    Boolean processed 
    Date date 
    Integer urlCrc 
} 

hình thức của tôi chỉ có 3 lĩnh vực đầu tiên và tôi muốn để tính toán urlCrc mỗi khi phương pháp save() được gọi. Tôi không thể chỉ ghi đè lên phương pháp lưu vì nó được tiêm.

Trả lời

16

Bạn có thể sử dụng các sự kiện GORM - xem docs. Vì theo mặc định, validate() được gọi trước mỗi save() Tôi sẽ sử dụng điều đó.

class Page { 
    //your defs here 

    def beforeValidate() { 
     this.urlCrc = yourComputationHere 
    } 
} 
+0

Cảm ơn, nó hoạt động. Thật không may grails.org đã ngừng hoạt động do một số sự cố định tuyến http://grails.1312388.n4.nabble.com/Is-the-plugin-repository-down-td4628824i40.html vì vậy tôi cần hỏi tại đây – mrok

+0

Ở trên giải pháp có lẽ là tốt nhất, nhưng một lựa chọn khác là sử dụng một trường tính toán grails. Xem tài liệu cho điều đó. –

+1

Nếu bạn muốn thực thi mã trước khi lưu sử dụng 'beforeUpdate()/beforeInsert()'. nếu bạn sử dụng 'beforeValidate()', nó được gọi là luôn luôn khi bạn gọi 'validate()' (phương thức 'save()' call 'validate()' trước khi lưu). Vì vậy, mã của bạn được thực thi trước khi xác thực ngay cả khi bạn không lưu. – IgniteCoders

1
class Page { 
    def beforeInsert() { 
     this.beforeUpdate() 
    } 
    def beforeUpdate() { 
     this.urlCrc = 'calculate something' 
    } 
} 
+1

bạn có thể liên kết đến tài liệu về điều này không? – dopatraman

+0

Có, đây là [tài liệu] (http://docs.grails.org/1.3.6/guide/5.%20Object%20Relational%20Mapping%20 (GORM) .html # 5.5% 20Advanced% 20GORM% 20Features) – IgniteCoders

Các vấn đề liên quan