我甚至不知道从哪里开始解释我的问题,所以请耐心等待:(!
我有两个型号;产品和类别 - 产品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)
这看起来运行得很好,直到我看看它在数据库中产生了什么...这是两个表的输出。
id:1
....
....
....
category:< ----所有10,000多条记录都是空的...错误的wtf?当然应该是类别ID或名称
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。我在这里遗漏了一些基本的东西!?
答案 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 Product
,categories
表需要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
以连接它们...
希望这可以解决问题!