2009-05-22 7 views
35

레일 연관에 대한 초보자 질문 비트.레일 : belongs_to 대 has_one

나는 버그 모델과 상태 모델을 가지고있다. 상태는 기본적으로 키/값 쌍 테이블입니다. 가능한 선택 중에서 Bug has_one Status가 가장 합리적이라고 말하고 싶습니다. 그러나,에 따르면 this

콘텐츠 belongs_to ContentTemplate. 으로 가서 문제를 어떻게 설명했는지 살펴보십시오. 그러면 문제가 해결됩니다. belongs_to를 사용하면 테이블에서 외래 키에 대해 책임을 수락합니다. 따라서 콘텐츠에 content_template_id가 있습니다. 그리고 ContentTemplate은 아무 것도 필요하지 않습니다. 나는 그걸 의지 할 수 있습니다. 끝난.

버그 belongs_to 상태가 더 적절합니다 (버그가 외래 키를 가져야하기 때문에). 의미 론적으로, 그의 예는 의미가 있지만 내 것은 아무 것도 만들지 않는다. 이것은 이런 상황에서 이상하게 보일 수 밖에없는 레일의 단점입니까, 아니면 뭔가 이해하지 못하거나 잘못하고있는 것입니까?

답변

18

예, 레일스에서 ​​약간 이상한 시나리오를 발견했다고 생각합니다. 나는 "상태"를 버그가 속한 일종의 범주로 보는 것이 유용 할 것이라고 생각합니다. 그 빛에서 그것은 의미가 있습니다.

+3

나는 레일즈가 의미 상으로 어떻게 작동하는지에 대한 유언으로 생각한다. 나는이 상황에 부딪쳤다. "나는 틀림없이해야 할 것 같다." –

0

상태가 룩업/키 - 값 표인 경우 상태와 버그 사이에 habtm (has_and_belongs_to_many) 관계가 필요할 수 있습니다. habtm을 사용하면 결국 bugs_statuses 조인 테이블에 버그 및 상태 테이블과 함께 bug_idstatus_id 열이 있습니다.

+0

이는 다 대다 관계에 대한 것으로 이는 그렇지 않습니다. 이것은 다 대일입니다. 내 질문은 기본적으로 그 관계에 대한 표현은 일대 다, 많지 않은 것, 그리고 그것을 처리하는보다 우아한 방법이있는 경우에만 의미가 있다는 것입니다. –

+0

. 내 생각에 "버그"와 "상태"에 대한 일반적인 생각은 버그가 여러 상태 (예 : "worksforme"및 "open")로있을 수 있거나 버그 상태의 기록을 유지하려는 것일 수 있습니다. – 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

상태가 많은 버그를 가질 수 있기 때문에 버그는 외래 키를 사용하지만 버그는 한 번에 하나의 상태 만 갖습니다. – Chuck

+0

당신의 새로운 해결책은 우리가 상황을 어떻게 생각 하는가하는 것이지만 작동하지 않습니다. bug.status를 수행하면 status에 존재하지 않는 bug_id 열을 찾습니다. has_one 또는 has_many는 "had"인 클래스의 belongs_to와 일치해야합니다. – Chuck

+0

어떻게 바꿀까요? 내 답변을 자유롭게 복사하고 원하는 경우 변경하십시오. 나는 당신이 모델이 어떻게 보일 것이라고 생각 하는지를 알고 싶어합니다. –

2

당신은 당신이 얻을 싶은 것이 버그 및 상태 사이의 관계의 종류를 정확하게 설명하지 않았다,하지만 난 당신이 다음 중 하나에 관심이있는 가정

  • 일대이에 버그 클래스에 has_many, 상태 클래스에 belongs_to이 있어야합니다.
  • 일대일 :이 경우 버그 클래스에는 has_one이고 상태 클래스에는 belongs_to이어야합니다.

두 경우 모두 상태에 외래 키가 포함되어 있습니다. 두 번째 경우에는 일대일 관계가 실제로 비대칭 적이기 때문에 (한쪽에만 FK가 있어야 함) 약간의 이상이 있습니다.

+1

문제는 개념적으로 또는 한 번에 많은 상태를 가진 버그가 없다는 것이다. 적절한 구현. 개념적으로, 우리는 * 많은 버그에 속하는 것으로 생각하지만, Rails는 많은 버그가있는 상태로만 표현할 수 있습니다. – Chuck

+0

@chuck : 꽤 많이 있습니다. 일대 다 대 다 대 일대 다. 논리적으로는 거의 비슷하지만 개념적으로 차이가 있습니다. –

관련 문제