0

我在 Rails 2.3.5 中编写了一个在线服装商店的应用程序。我想在客户查看产品详细信息页面时显示相关产品。

例如,如果客户查看西装的详细信息页面,我想展示与连衣裙相匹配的配饰产品,例如背心、鞋子和腰带。我已将相关产品命名为 Ensemble。然而,背心、鞋子和腰带也是让我苦苦挣扎的产品。

我让它按如下方式工作,但我知道这不是 Rails 方式。我有一个所有产品的产品表。这里不重要,但我也有一个 ProductDetails 表。我有一个包含以下列的 Ensembles 表:

  • product_id - 主要或原始产品,显示在详细信息页面上的产品
  • suit_id - 相关或附属产品

在设置数据时,在 Products 列表中,对于每个 Product 我都有一个 Ensemble 链接。此链接将您带到 Ensembles 控制器中的索引操作。

使用“主”产品的 id,我通过 product_id 找到所有关联的 Ensemble 行,或者我创建一个新的 ensemble 并将主产品的 id 分配为 product_id。我希望能够通过 @product.related_products 获得一个 Ensemble 集合。

同样在索引页面上,我列出了主要产品的列,以便用户可以确定他们的主要产品是他们从列表中选择的产品。我还有一个其他产品的选择列表,其中包含“添加到合奏”操作。

最后在同一个索引页面上,我有一个表格,显示已经在集合中的产品,并且在该列表中,每一行都有一个销毁链接,用于从集合中删除特定产品。如果给定单个 Ensemble 行 @ensemble 我可以做 @ensemble.product 来获取与 ensemble 行的装备 ID 相关的产品,那就太好了。

我已经让它在没有关联的情况下工作,但我必须在控制器中运行查询来构建我自己的@product、@ensemble 和@ensemble 集合。此外,我发现销毁合奏行的唯一方法是通过 Ensemble.connection.delete(sql to delete),简单的 @ensemble.destroy 不起作用。

任何人都知道我将如何设置关联或提供指向解释类似设置的站点的链接。我发现的所有示例都没有使用同一张表。他们通过 C 与 B 相关。我想要通过 B 与其他 A 相关的 A。

4

1 回答 1

2

如下设置您的关联:

class Product < ActiveRecord:Base
  has_many :ensembles
  has_many :outfits, :through => :ensembles
end

class Ensemble < ActiveRecord:Base
  belongs_to :product
  belongs_to :outfit, :class_name => "Product", :foreign_key => :outfit_id
end

现在您可以执行以下操作:

p.outfits # all ensemble products for given product.
p.outfits << p2 # add product to the ensemble of given product.
p.outfits.delete(p3) # delete product from the ensemble of given product.
于 2010-05-01T17:45:30.393 回答