【问题标题】:Rails association not workingRails 协会不起作用
【发布时间】:2011-02-07 21:48:14
【问题描述】:

我什至不知道从哪里开始解释我的问题,所以请多多包涵:(!

我有两个模型;产品和类别 - 产品有_一个类别和类别属于_产品

产品型号

身份证
名称
说明
品牌
商户
价格
图片
链接
类别


类别模型

身份证
名称
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)

这似乎运行良好,直到我查看它在数据库中生成的内容...这是两个表的输出。

产品表
(精简版,包含 10,000 多条记录)

id:1
....
....
....
类别:

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

id:1
名称:袜子
product_id: 10662

id:2
名称:组合
product_id: 10658

id:3
名称:鞋
product_id: 9954

id:4
名称:睡衣
product_id: 10653

id:5
名称:帽子
product_id: 10655

id:6
名称:短裤
product_id: 10221

id:7
名称:牛仔裤
product_id: 9973

id:8
名称:培训师
product_id: 8072

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

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

【问题讨论】:

  • 好的,现在可以了。但是,它现在将所有产品的 category_id 设置为“1”!?我猜这行有问题: :category_id => Category.find_by_name(node.xpath("./cat/text()").inner_text.downcase)
  • 啊哈!我破解了它。该行应该是 :category 而不是 :category_id -> :category => Category.find_by_name(node.xpath("./cat/text()").inner_text.downcase)

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


【解决方案1】:

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

类产品 属于_to:类别 结尾 类别 类别 has_many :产品 结尾

其次,您的产品表应该有一个 category_id,而不是一个类别,并且您的类别表根本不应该有一个 product_id。然后您的代码示例应该可以正常运行。

【讨论】:

    【解决方案2】:

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

    产品
    belongs_to :category

    类别
    has_many :products

    【讨论】:

    • 那是你的另一个问题。您想要has_many 产品,而不是has_one(除非确实存在 1:1 的类别映射->产品)
    • 好的。我得到了您的 cmets,我刚刚尝试过,现在 product.category 和 category.product_id 字段对于所有记录都是空的,这也不正确。我是否需要杀死 category 表上的 product_id 列并在 products 表上创建一个 category_id ?换句话说,反转它。
    【解决方案3】:

    当您使用 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 指令的模型才会在其表中存储任何关系数据。事实上,Rails 很聪明,知道当您在创建产品时指定 {:category => cat} 选项时,它实际上应该更改 categories 表 - 确实如此。这就是为什么您在 categories 表中看到 product_ids,而在 products 表中没有任何内容(并且列 products.category 甚至不需要存在 - 没有它,关系将正常工作)。

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

    希望这能解决问题!

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多