2009-05-22 32 views
35

Một chút câu hỏi về newbie trên các liên kết đường ray.Đường ray: thuộc_to vs has_one

Tôi có mô hình Lỗi và mô hình Trạng thái. Về cơ bản, trạng thái chỉ là bảng cặp khóa/giá trị. Trong số các lựa chọn có sẵn, tôi sẽ nói Bug has_one Status có ý nghĩa nhất. Tuy nhiên, theo số this

Nội dung thuộc_to ContentTemplate. Hãy quay lại và xem cách tôi mô tả sự cố và bạn sẽ thấy nó hoạt động. Với thuộc tính, bảng chấp nhận trách nhiệm đối với khóa ngoại. Vì vậy, Nội dung có content_template_id. Và ContentTemplate không cần bất kỳ thứ gì. Tôi có thể trỏ tới tùy ý. Làm xong.

Lỗi thuộc_to Trạng thái sẽ phù hợp hơn (vì lỗi nên lấy khóa ngoại). Về mặt ngữ nghĩa, ví dụ của ông có ý nghĩa, nhưng tôi không làm gì cả. Đây có phải chỉ là một quirk của đường ray mà trong tình huống này có vẻ lạ, hoặc tôi không hiểu một cái gì đó/làm điều đó sai?

Trả lời

18

Vâng, tôi nghĩ bạn vừa tìm thấy một trường hợp hơi kỳ lạ trong Rails. Tôi cho rằng nó có thể hữu ích để xem "trạng thái" như là một loại thể loại mà lỗi thuộc về - trong ánh sáng đó, nó có ý nghĩa.

+3

Tôi đoán nó đứng như một minh chứng cho cách đường ray độc đáo hoạt động ngữ nghĩa, mà nhấn tình huống này tôi đã như "Tôi phải làm sai" –

0

Nếu Trạng thái chỉ là bảng tra cứu/khóa-giá trị, có vẻ như bạn có thể muốn mối quan hệ habtm (has_and_belongs_to_many) giữa Trạng thái và lỗi. Với habtm, những gì bạn sẽ kết thúc là một bảng tham gia bugs_statuses có các cột bug_idstatus_id cùng với các bảng lỗi và trạng thái của bạn.

+0

Đó là cho các mối quan hệ nhiều người, điều này không phải. Đây là một trong nhiều. Câu hỏi của tôi là về cơ bản xung quanh rằng từ ngữ cho mối quan hệ đó chỉ có ý nghĩa trong một một-nhiều, không phải là một-nhiều, và nếu có một cách thanh lịch hơn để xử lý nó. –

+0

Đã hiểu. Tôi đoán suy nghĩ điển hình của tôi về "Lỗi" và "Trạng thái" của họ là một lỗi có thể ở nhiều trạng thái cùng một lúc (ví dụ: "worksforme" và "open") hoặc bạn có thể muốn giữ lịch sử trạng thái của lỗi. – rnicholson

9
TABLE: 
    Bug 
    id integer 
    desc string 
    status_id integer fk 

    Status 
    id integer 
    desc string 

RAILS MODEL: 
    Bug 
    belongs_to :status 

    Status 
    has_many :bugs 
+2

Lỗi sẽ lấy khóa ngoại vì một trạng thái có thể có nhiều lỗi, nhưng một lỗi chỉ có một trạng thái tại một thời điểm. – Chuck

+0

Giải pháp mới của bạn là cách chúng tôi nghĩ về tình hình, nhưng nó sẽ không hoạt động. Khi bạn làm bug.status, nó sẽ tìm một cột bug_id trong trạng thái không tồn tại. Một has_one hoặc has_many cần phải được kết hợp bởi một thuộc tính trong lớp đang được "có". – Chuck

+0

Bạn sẽ thay đổi nó như thế nào? Vui lòng sao chép câu trả lời của tôi vào câu trả lời của bạn và thực hiện thay đổi ở đó nếu bạn thích. Tôi chỉ tò mò muốn biết những gì bạn nghĩ rằng các mô hình sẽ như thế nào. –

2

Bạn đã không giải thích một cách chính xác những gì loại mối quan hệ giữa Bug và tình trạng bạn muốn nhận được, nhưng tôi giả sử bạn đang quan tâm đến một trong các cách sau:

  • một-nhiều: trong này trường hợp phải có has_many trong lớp Lỗi và belongs_to trong lớp Trạng thái,
  • một-một: trong trường hợp này, cần có has_one trong lớp Lỗi và belongs_to trong lớp Trạng thái.

Trong cả hai trường hợp Trạng thái chứa khóa ngoài. Trong trường hợp thứ hai, từ ngữ hơi lạ, do thực tế mối quan hệ một-một trong thực tế là không đối xứng (chỉ nên có một FK ở một bên).

+1

Vấn đề là một lỗi không có nhiều trạng thái tại một thời điểm, hoặc là khái niệm hoặc trong thực hiện đúng. Về mặt khái niệm, chúng ta nghĩ về một trạng thái như * thuộc về * nhiều lỗi, nhưng Rails chỉ có thể diễn tả điều này như một trạng thái có nhiều lỗi. – Chuck

+0

@chuck: Đó là khá nhiều. One-to-Many vs Nhiều-một. Hợp lý, khá nhiều tương đương, nhưng khái niệm có sự khác biệt –

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