2011-02-07 128 views
0

我甚至不知道從哪裏開始解釋我的問題,所以請多多包涵:(Rails的協會工作不

我有兩個型號,產品和類別 - 產品HAS_ONE類別和類別belongs_to的產品

產品型號

ID

描述
品牌
商人
價格
圖像0​​ 鏈接
類別


分類模型

ID

PRODUCT_ID


確定,所以現在我循環通過XML飼料製造產品,像這樣:

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) 

這似乎運行偉大,直到我看到了它在數據庫的製作......下面是兩個表的輸出。

Products表
(刪節版,包含10,000條記錄)

ID:1
....
....
....
類別:< ----爲所有超過10,000條記錄清空... err wtf?當然應該是一個類別ID或名稱

類別表
(僅包含8個記錄,一個用於每個類別)

ID:1
名:襪
PRODUCT_ID:10662 < ---- ERR WTF ?

ID:2
名:組合
的product_id:10658 < ---- ERR跆拳道?

ID:3
名稱:鞋
的product_id:9954 < ---- ERR跆拳道?

ID:4
名:睡衣
的product_id:10653 < ---- ERR跆拳道?

ID:5
名稱:帽子
的product_id:10655 < ---- ERR跆拳道?

ID:6
名稱:短褲
的product_id:10221 < ---- ERR跆拳道?

ID:7
名稱:牛仔褲
的product_id:9973 < ---- ERR跆拳道?

ID:8
名稱:教員
的product_id:8072 < ---- ERR跆拳道?

說實話,我很困惑,我不知道我想要看到了: -/

我只想兩個表連接在一起笑。我在這裏錯過了一些基本的東西!?

+0

好吧,現在正在工作。但是,現在將所有產品的category_id設置爲'1'!?我猜這是這行錯了::category_id => Category.find_by_name(node.xpath(「./cat/text()」)。inner_text.downcase) – Zinc 2011-02-07 22:45:37

+0

Ah Ha!我破解了它。該行應該是:category而不是:category_id - >:category => Category.find_by_name(node.xpath(「./cat/text()」)。inner_text.downcase) – Zinc 2011-02-07 23:02:04

回答

1

有一對夫婦,你需要做出改變的。首先,你的模型結構應該是這樣的:

 
class Product 
    belongs_to :category 
end 

class Category 
    has_many :products 
end 

其次,你的產品表應該有一個CATEGORY_ID,而不是一個類別,您的類別表不應該有一個PRODUCT_ID可言。您的代碼示例應該可以正常運行。

1

你的關係是倒退的。如果你想有一個產品是在一個單一的類別,你需要:

產品
belongs_to :category

類別
has_many :products

1

當您使用has_one/belongs時,只有一個的模型最終包含另一個的id。在你的情況下,因爲Category belongs_to Productcategories表需要一個product_id列,它將存儲它所屬產品的ID。

但如果Product has_one Category(這也適用於has_many),它需要category_id列 - Rails的人都知道,找到一個給定的產品(P)類(C),它可以只去翻categories表,其中product_id == p.id.

從您發佈的代碼看來,Rails正在做它應該做的事情 - 即使可以從兩種模型訪問關係,只有具有belongs_to指令的模型才具有存儲在其表中的任何關係數據。事實上,Rails很聰明,知道當你在創建產品時指定{:category => cat}選項時,它實際上應該改變categories表 - 它確實如此。這就是爲什麼你在categories表中看到product_id s,並且products表中沒有任何內容(和products.category甚至不需要存在 - 如果沒有它,關係也可以正常工作)。

就這樣說,我懷疑一個產品應該能夠屬於多個類別,同樣,一個類別應該能夠包含多個產品。在這種情況下,你會希望在車型使用has_and_belongs_to_many,並創建連接表categories_products將它們連接起來......

希望這將清除的東西了!