2012-01-07 27 views
5

Có cách nào dễ dàng trong Grails không cho phép xóa cho bất kỳ Lớp Miền nào không? Và thay vào đó có một lá cờ xóa trong mỗi tên miền được cập nhật bất cứ khi nào một cái gì đó bị xóa.Cập nhật Grails thay vì xóa

Ngoài ra, có hiệu lực tất cả các phương pháp liệt kê/hiển thị không được hiển thị đối tượng nơi cờ xóa là đúng.

Tôi biết mình có thể làm điều đó bằng cách chỉnh sửa thủ công tất cả các phương pháp CRUD trong tất cả các bộ điều khiển nhưng có vẻ hơi quá nhiều công việc khi làm việc với Grails.

Phương pháp danh sách thông thường của tôi trông giống như sau, hầu như tất cả các phương pháp danh sách trong dự án của tôi cho phép người dùng truy cập những thứ chỉ thuộc về công ty của người dùng.

def list = { 
    params.max = Math.min(params.max ? params.int('max') : 10, 100) 
    def documentsList = Documents.createCriteria().list(params){ 
     eq("company.id",session.companyId) 
     maxResults(params.max) 
     order("dateCreated","desc") 
     //firstResult(params.offset) 
    } 
    [documentsInstanceList: documentsList , documentsInstanceTotal: documentsList.getTotalCount() ] 
} 

Trả lời

11

Bạn sẽ phải dọn dẹp các phương pháp xóa và liệt kê tất cả các lớp miền của bạn. Thêm mã như thế này vào Bootstrap của bạn

class BootStrap { 

    def grailsApplication 

    def init = { servletContext -> 

    for (dc in grailsApplication.domainClasses) { 

    dc.clazz.exists(-1); //to register meta class 

    def gormSave = dc.clazz.metaClass.getMetaMethod('save');   
    dc.clazz.metaClass.delete = { -> 
     delegate.deleted = true 
     gormSave.invoke delegate 
    } 

    dc.clazz.metaClass.delete = { Map args -> 
     delegate.deleted = true 
     gormSave.invoke(delegate, args) 
    } 

    dc.clazz.metaClass.static.list = { -> 
     def crit = delegate.createCriteria(); 
     def list = crit.list{ 
      eq('deleted', false) 
     } 
     return list; 
    } 



    } 
} 

    def destroy = {} 
} 
+1

Tôi thích giải pháp này, mặc dù tôi cũng sẽ thêm thuộc tính tĩnh vào các lớp miền mà tôi muốn hành vi này và chỉ ghi đè lên và xóa danh sách đúng. Bằng cách đó bạn vẫn có thể có các trường hợp của các lớp miền thực sự bị xóa. – erturne

+0

điểm tốt. Ngoài ra, nó có thể làm cho tinh thần để tạo ra một phương pháp mới như hardDelete trên các lớp miền có phương pháp xóa mặc định sửa đổi. –

+0

Ý tưởng hay. Ngoài ra, thay vì một thuộc tính tĩnh như tôi đã đề cập ở trên, chỉ cần tìm sự tồn tại của thuộc tính bị xóa. Điều này có thể dễ dàng được biến thành một plugin Grails. Gọi nó là xóa mềm. – erturne

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