2011-02-07 80 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将它们连接起来......

希望这将清除的东西了!