2009-12-02 3 views
1

레일스에서 ​​응용 프로그램을 만드는 데 문제가 있습니다.레일에 has_many 관계 설정

이 응용 프로그램에는 회사를 나타내는 모델과 제품을 나타내는 모델이라는 두 가지 모델이 있습니다. 각 회사는 0 개 이상의 제품을 판매하고 있으며 모델에서 이러한 관계를 포착하려고합니다. 여기에 지금까지있어 무엇 :

script/generate scaffold company name:string product_id:integer 

script/generate scaffold product name:string 

나는 각 회사가 여러 제품을 가질 수 있음을 보여 회사의 모델에 다음 줄을 추가 :

내가 발전기를 실행하여 모델을 생성

belongs_to :company 

I :

has_many :products 

나는 제품 모델에 다음 라인을 추가 YAML 파일에 샘플 데이터를 만들었습니다.

microsoft: 
    name: Microsoft 
    product_id: [1, 3] 

google: 
    name: Google 
    product_id: [2, 4] 

그리고 제품에 대한 샘플 데이터는 다음과 같습니다 : 회사에 대한 샘플 데이터입니다 그때 나는 시도하고

rake db:fixtures:load 

: 다음 샘플 데이터를로드

word: 
    id: 1 
    name: Word 

earth 
    id: 2 
    name: Earth 

excel: 
    id: 3 
    name: Excel 

chrome: 
    id: 4 
    name: Chrome 

회사보기에있는 회사의 모든 제품을 인쇄하려면 :

<% if @company.product_id %> 
<% for product in @company.product_id %> 
    <tr> 
    <td><%=h product.name %></td> 
    </tr> 
<% end %> 
<% end %> 

이것은 오류가 발생하는 곳입니다. 어떤 아이디어? 문제가 뭔지 잘 모르겠습니다. 내가 모델을 생성하거나 관계를 구축하는 방법에있을 수 있다는 것을 모두 알고 있습니다. 또는 뷰에서 정보를 인쇄하려고 시도하는 중일 수도 있습니다.

답변

7

먼저 필드 설정이 잘못되었습니다. has_manybelong_toproducts이어야하며 그 반대의 경우는 company_id이어야합니다. 일대 다 관계의 경우 외래 키는 항상 방정식의 "많은"측면에 배치되어야합니다.

<% for product in @company.products %> 
    <tr> 
    <td><%=h product.name %></td> 
    </tr> 
<% end %> 
+0

그건 의미가 있습니다. 그러나 어쨌든 방정식의 "한쪽"에 키를 놓고 싶다면 아마도 키 목록을 만들어 이것을 표현하는 방법이 있을까요? – Mark

+2

기본 RDBMS 디자인은 일대 다의 "many"측면에 외래 키가 필요합니다. '[something]의 목록'은 최신 데이터베이스의 열 유형이 아니기 때문입니다. 이것은 Rails와는 아무런 관련이 없습니다. – ScottJ

+0

글쎄, 정말로 정말로하고 싶다면 ActiveRecord.serialize : http://rails.rubyonrails.org/classes/ActiveRecord/Base.html#M002284 하지만 그것은 당신을 해칠 것이고 매우 될 것입니다. 어려운. – kikito

0

당신은 당신의 오류가 무엇인지 말을하지 않습니다,하지만 난 당신의 YML 파일이 꽤 괜찮 아니라고 생각 :

는 그리고 당신이 대신합니다. 내가 확인

마지막으로, 이것은 가능하지 않았다 :

microsoft: 
    name: Microsoft 
    product_id: [1, 3] 

PRODUCT_ID : "목록"전용 "태그"동의합니다 -> 워드, 엑셀을. 그런 다음 "이상한"ID를 생성합니다 (태그 문자열의 해시 사용). 그래서 그것은 잘 작동하지 않을 것입니다.

다른 사람들이 말했듯이, 제품에 client_id를 넣으면 훨씬 쉬울 것입니다. 데이터베이스가 작동하는 방식입니다.

관련 문제