2011-02-06 2 views
0

좋아, 그럼 데이터베이스를 정규화하기 시작했습니다. 현재 카테고리 이름과 판매자 이름이있는 제품을 포함하는 데이터 피드 (XML)를 통해 약 60,000 개의 제품이 채워지는 하나의 모델 "제품"이 있습니다. 나는 이것을 3 가지 모델로 나누고 싶다; 제품, 카테고리 및 상인.두 테이블 간의 링크를 만드는 방법

각 제품이 하나 개의 범주와 자연 아이디어는 이러한 모델 만드는 것입니다 수 있도록 한 상인 :

CATEGORY_ID을 | category_name

merchant_id | merchant_name

has_one, belongs_to 등의 모델을 연결하는 코드를 만들 수 있지만, 새로운 제품을 카테고리와 판매자와 자동으로 연결하는 데 어려움을 겪고 있습니다.

저는 빈 데이터베이스로 시작하는 책에서 예제를 보았습니다. 매우 간단한 것처럼 보입니다. 그러나 전체 데이터베이스와 범주 ​​이름 목록부터 시작하겠습니다.

이 여기에 큰 노력하고 내 제품 생성 성명 : (난 다음이 BTW 잘못 알고있다!), 카테고리 라인 ... :

Product.create(:name => node.xpath("./text/name/text()").inner_text.downcase, 
        :description => node.xpath("./text/desc/text()").inner_text, 
        :brand => node.xpath("./brand/text()").inner_text, 
        :merchant => node.xpath("../@name").inner_text, 
        :category => node.xpath("./cat/text()").inner_text.downcase, 
        :price => "£" + node.xpath("./price/btext()").inner_text) 

내가 같은 것을 할 필요가있을 것이다,을 참조하십시오

Product.create(:name => node.xpath("./text/name/text()").inner_text.downcase, 
        :description => node.xpath("./text/desc/text()").inner_text, 
        :brand => node.xpath("./brand/text()").inner_text, 
        :merchant => node.xpath("../@name").inner_text, 
        :category => << Category.find_by_name(node.xpath("./cat/text()").inner_text.downcase), 
        :price => "£" + node.xpath("./price/btext()").inner_text) 

아이디어가 있으십니까? 이것도 이해가 되니? 대규모 데이터 세트를 위해 시간이 걸릴 것입니다

Product.all do |product| 
    product.category = Category.find_or_create_by_category_name(product.category_name) 
    product.merchant = Merchant.find_or_create_by_merchant_name(product.merchant_name) 
    product.save! 
end 

: 그래서, 당신이 뭔가를 할 수있는, 열을 가정

답변

1

category_namemerchant_name라고, 당신은 CategoryMerchant에 연결을 설정 한 더 나은 솔루션이 필요할 수도 있습니다. CATEGORY_ID에 제품 테이블의 범주 값 또는 범주 이름에 값을 설정 :

그래서이 사실을 설정합니다?

.find_or_create_by는 속성에 발견을 수행하고 일치하는 행을 반환하거나 존재하지 않는 경우 새로 만듭니다. `.category = '를 통해 연관을 만들 때, 레일스는 카테고리 테이블에있는 행의 ID와 일치하도록 외래 키를 설정합니다.

그래서 더 직접적으로 귀하의 질문에 대답하기 :

Product.create(:category=>Category.find_or_create_by_name("Magic Beans")) 

이 일 같다 :

category = Category.find_by_name("Magic Beans") 
if category.nil? 
    category = Category.create(:name=>"Magic Beans") 
end 
product = Product.new 
product.category = category 
product.save 

을 끝에서 두 번째 단계는 값 category.id에 외부 키 category_id을 설정하는 것을 특징으로하는 방법. 관례에 따라 외래 키는 _id이라는 접미사가 붙은 모델 이름이므로 제품 테이블은 category_idmerchant_id이어야합니다.

+0

안녕하세요, 제 질문에 이미 대답했지만 이미 위의 코드 샘플을 추가 한 것 같습니다. – Zinc

+0

'Category.find_by_name'을'Category.find_or_create_by_name'으로 바꾸고,'상인 '에게 똑같은 일을시키는 것이 트릭을해야한다고 생각합니다. – zetetic

+0

이렇게하면 실제로 products 테이블의 : category 값을 category_id로 설정하거나 값을 category_name으로 설정합니까? – Zinc

관련 문제