2013-04-23 2 views
0

내 Rails 응용 프로그램에 대해 자체 참조 연결을해야한다고 생각합니다. (주석을 읽은 후에는 자기 참조가 아니지만 명명 문제가 여전히 존재한다고 생각합니다. 내가 컨셉을 레일 스퀘어 (Railscast)를 본 후에도 어떻게 세워야하는지 알아낼 수 없다. 내 앱에서 사용자는 다른 사용자의 리뷰를 작성할 수 있습니다. 따라서 사용자는 has_many : 많은 검토를 작성했다는 의미에서 검토합니다. 리뷰 및 Review.rb : 나는, 내가 이미 말한 이후 마이그레이션에서 사용자 has_many : reviews twice

User.rb 

has_many :reviews (a user can review many professionals) 


Review.rb 

belongs_to :user 

내가,

rails g resource Review user_id:integer review:text 

내 질문은 뭐하는 거지 ... 그 아래 User.rb의 has_many 코딩했습니다 belongs_to : 검토를 수행하는 사용자에 대한 검토, 검토중인 사용자에 대한 연관을 어떻게 추가합니까? 또한 검토 대상 사용자의 ID를 포함하도록 이전에 추가 할 내용은 무엇입니까?

+0

이것은 자기 참조가 아닙니다. 사용자가 리뷰를 참조합니다. 리뷰 참조 사용자. "자체 참조"검토는 사용자가 사용자를 참조했거나 검토가 검토를 참조한 경우입니다. – meagar

+0

오케이, 자기 참조가 아니지만 문제는 여전히 남아 있습니다. 사용자 has_many : 리뷰 (리뷰 한 사람)와 사용자 has_many : 리뷰 (여러 번 리뷰 됨) 어떻게 처리합니까? – BrainLikeADullPencil

+0

@meagar 귀하의 의견을 토대로 제목을 업데이트했습니다. 감사합니다. – BrainLikeADullPencil

답변

3

테이블 테이블은 실제로는 두 개의 키가 users 테이블을 가리키는 다 대다 테이블입니다.

먼저 키 이름을 결정해야합니다. 나는 "리뷰어"와 "리뷰어"가 잠재적으로 혼란 스럽기 때문에 "저자"와 "주제"를 제안 할 것입니다.

당신은 thusly 히 모델을 설정하는 것 :

class User 
    has_many :authored_reviews, class_name: "Review", foreign_key: "author_id" 


class Review  
    belongs_to :author, class_name: "User" 
    belongs_to :subject, class_name: "User" 

내가 당신에게없는 게 조각은 당신이 사용자가 검토 한 사람보고 싶은 생각? 이를 위해 다른 has_many을 사용자 모델에 추가하고 다른 foreign_key을 지정하십시오. 가장 힘든 부분은 이름입니다. "사용자가 많은 검토 대상입니다"라고 말하지만 "referencing_reviews"로 충분할 수 있습니다. 나는 단순히 "리뷰"를 선택할 수 있습니다 생각 :

class User 
    # Reviews this user has written 
    has_many :authored_reviews, class_name: "Review" 

    # Reviews others have written about this user 
    has_many :reviews, class_name: "Review", foreign_key: "subject_id" 

또 다른 전략은 메시지 등의 리뷰를 치료하고 협회 sent_reviewsreceived_reviews, 또는 written_reviewsreceived_reviews를 호출 할 수 있습니다. 이름을 지정하는 것은 어려울 수 있지만 적절하게 수정하는 것이 중요합니다. 유지 보수 가능한 소프트웨어 작성의 중요한 부분입니다.

reviews 테이블에 대한 마이그레이션을 생성하는 당신을위한 _id 접미사 및 인덱스 설정되는, 외부 키에 대한 references 대신 integer를 사용하려면

$ rails g model Review author:references subject:references 

이 당신에게 author_idsubject_id 열을 줄 것이다 .

+0

감사합니다. 누가 실제로 리뷰를했는지보다는 누가 리뷰를 받았는지 확인하는 것이 더 중요합니다. 나는이 코드가 사용자 --- has_many : reviews, class_name : "Review"에서 사용자가 수행 한 리뷰인지 또는 사용자 리뷰의 대상인지 여부를 명확히하지 않습니다. – BrainLikeADullPencil

+0

@BrainLikeADullPencil 업데이트 참조; 나의 초기 개정은 끝나지 않았다. – meagar

+0

감사합니다. 작동합니다. 저는 저자와 subject_id를 숨겨진 필드에 넣어야합니다.일반적으로 연관을 사용하면 user_id가 자동으로 db 레코드에 삽입되지만 여기에서는 author_id 및 subject_id가 숨겨진 필드를 추가 할 때까지 비어 있습니다. – BrainLikeADullPencil