2011-10-07 26 views
6

Tôi đang thiết kế một hệ thống trong đó các bài đăng/thảo luận giữa người dùng có thể được nâng cấp để trở thành vé. Tại một địa điểm cụ thể, tôi đang cố gắng tạo mối quan hệ tùy chọn một-một nhưng đang chạy vào một số vấn đề nhất định. Một phiên bản ngưng tụ của các thực thể trong ánh đèn sân khấu được đưa ra dưới đây.Grails/GORM: tạo mối quan hệ tùy chọn một-một-một

Rules:

  1. Một bài viết có thể trở thành một vé nếu có yêu cầu. (tùy chọn)
  2. Vé phải có Bài đăng. (Bắt buộc)

Post.groovy

class Post { 

     String title 
     String description 
     String postedBy 

     Ticket ticket 

     static hasMany = [comments: Comment] 

    static constraints = { 
     title(blank:false) 
     description(blank:false) 
     postedBy(blank:false) 
     ticket (nullable:true,unique:true) 
    } 
} 

Ticket.groovy

class Ticket { 

     String title 
     String description 
     String postedBy 

     Post post 

     static hasMany = [responses: Response] 

     static constraints = { 
       title(blank:false) 
       description(blank:false) 
       postedBy(blank:false) 
       post (nullable:false,unique:true) 
     } 

} 

này hoạt động đến một mức độ nào. Tôi có thể:

  1. Tạo một bài viết để lại vé thuộc tính null Nếu và khi bài được nâng cấp để trở thành một vé
  2. tôi rõ ràng có thể thiết lập thuộc tính vé của bài viết để trỏ đến vé mẹ.

Tuy nhiên, ánh xạ này không được thực thi ở cấp tên miền. Nó rời khỏi chỗ cho một tình huống mà Ticket1 chỉ tới Post1, nhưng Post1 chỉ tới Ticket2.

tôi đã cố gắng sử dụng một static hasOne = [post: Post] trong lớp nhưng sau đó biết rằng nó có quy định thành hiện diện của một static belongsTo = [ticket: Ticket] trong bài viết lớp và điều này sẽ trở thành một bắt buộc 1-to-1 mối quan hệ đó không phải là điều tôi tìm kiếm.

Có cách nào để đạt được ánh xạ tùy chọn 1 đến 1 này trong trường hợp này không? Mọi con trỏ sẽ hữu ích nhất.

+0

Vui lòng đóng câu hỏi nếu câu trả lời cho bạn hài lòng. Cảm ơn! :-) – sbglasius

+0

Nó không hoạt động. Tôi không nghĩ 1-1 có thể được tạo ra. Tôi có lẽ nên đóng nó như là unanswerable? –

Trả lời

3

Bạn có thể xem xét thực hiện một validator tùy chỉnh như

class Post { 
    // Other fields 

    Ticket ticket 

    static constraints = { 
    // Other constraints 
    ticket (nullable:true,unique:true, validator: { val, obj -> 
     if(val) { 
     return val.post == obj 
     } 
    }) 
    } 
} 

này sẽ giải quyết vấn đề của bạn?

+0

Xin chào, cảm ơn vì giải pháp của bạn! Nó hoạt động (với các chỉnh sửa nhỏ được thực hiện) và tốt hơn so với tình hình trước đó kể từ bây giờ có xác nhận tại ít nhất một đầu. Tuy nhiên, bây giờ vẫn còn một khả năng mà tôi đặt đối số vé chính xác trong bài đăng (vì trình xác thực thi hành nó) nhưng sau đó quay lại Ticket và thay đổi đối tượng Post mà nó trỏ tới. Tôi chỉ tự hỏi liệu có cách nào để thực thi nó từ cả hai đầu, nhưng tôi đoán là không? :( –

+0

Làm thế nào để xác thực khác ở đầu bên kia? Điều này có thể xảy ra? – sbglasius

+0

Hãy thử điều đó ngay bây giờ –

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