Rails协会无法正常工作

时间:2011-02-07 21:48:14

标签: ruby-on-rails ruby-on-rails-3

我甚至不知道从哪里开始解释我的问题,所以请耐心等待:(!

我有两个型号;产品和类别 - 产品has_one类别和类别belongs_to产品

产品型号

ID
命名
说明
品牌
商人
价格
图像
链接
类别


类别模型

ID
命名
PRODUCT_ID


好的,现在我循环遍历XML Feed,创建如下产品:

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)

这看起来运行得很好,直到我看看它在数据库中产生了什么...这是两个表的输出。

产品表
(删节版,包含10,000多条记录)

id:1
....
....
....
category:< ----所有10,000多条记录都是空的...错误的wtf?当然应该是类别ID或名称

类别表
(仅包含8条记录,每个类别一条)

id:1
名称:袜子 product_id:10662< ---- err wtf?

id:2
名称:组合
product_id:10658< ---- err wtf?

id:3
名称:鞋子 product_id:9954< ---- err wtf?

id:4
名称:睡衣
product_id:10653< ---- err wtf?

id:5
名称:帽子
product_id:10655< ---- err wtf?

id:6
名称:短裤
product_id:10221< ---- err wtf?

id:7
名称:牛仔裤
product_id:9973< ---- err wtf?

id:8
名称:培训师
product_id:8072< ---- err wtf?

说实话我很困惑,我不确定我想再看到什么: - /

我只想将两个表链接在一起lol。我在这里遗漏了一些基本的东西!?

3 个答案:

答案 0 :(得分:1)

你的关系倒退了。如果您希望产品属于单一类别,则需要:

产品
belongs_to :category

类别
has_many :products

答案 1 :(得分:1)

您需要进行一些更改。首先,您的模型结构应如下所示:

class Product
  belongs_to :category
end

class Category
  has_many :products
end

其次,您的产品表应该有category_id,而不是类别,您的类别表应该没有product_id。然后,您的代码示例应该正常运行。

答案 2 :(得分:1)

当你使用has_one /属于时,只有一个的模型最终包含另一个的id。在您的情况下,由于Category belongs_to Productcategories表需要product_id列,它会存储其所属产品的ID。

但如果Product has_one Category(这也适用于has_many),则需要category_id列 - Rails知道要查找类别( c)对于给定的产品(p),它可以通过categories表查看product_id == p.id的类别。

从你发布的代码来看,看起来Rails正在做它应该做的事情 - 即使可以从两个模型访问关系,只有具有belongs_to指令的模型在其表中存储了任何关系数据。事实上,当您指定{:category =>时,Rails足够聪明地知道cat}选项在创建Product时,它应该实际更改categories表 - 它确实如此。这就是为什么你在product_id表中看到categories的原因,products表中的任何内容(以及products.category列都不需要存在 - 关系没有它会很好的工作。)

据说,我怀疑产品应该能够属于多个类别,同样,类别应该能够包含多个产品。在这种情况下,您需要在两个模型中使用has_and_belongs_to_many,并创建连接表categories_products以连接它们...

希望这可以解决问题!