在Rails中建模自引用集合

时间:2010-05-01 17:25:52

标签: ruby-on-rails model self-reference

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

例如,如果顾客查看了西装的详细页面,我想展示与礼服相匹配的配饰产品,如背心,鞋子和腰带。我已将相关产品命名为Ensemble。然而,背心,鞋子和腰带也是我努力的产品。

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

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

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

使用“main”产品中的id,我通过product_id找到所有相关的Ensemble行,或者我创建一个新的整体并将主产品中的id指定为product_id。我想能够@ product.related_products来获得Ensemble系列。

同样在索引页面上,我列出了主要产品的列,以便用户可以确定他们的主要产品是他们从列表中选择的产品。我还有一个其他产品的选择列表,带有Add to Ensemble动作。

最后在同一个索引页面上,我有一个表格,显示已经在整体中的产品,在该列表中,每一行都有一个销毁链接,用于从整体中删除特定产品。如果给出一个单独的Ensemble行@ensemble,我可以做@ ensemble.product以获得与整体行的outfit_id相关的Product。

我的工作没有关联,但是我必须在控制器中运行查询来构建我自己的@product,@ mindmble和@ensembles集合。我发现破坏整体行的唯一方法是通过Ensemble.connection.delete(sql to delete),简单的@ ensemble.destroy不起作用。

任何人都知道我将如何设置关联或链接到解释类似设置的网站。我找到的所有示例都没有使用相同的表。他们有A与B到C有关。我想要A与其他A到B有关。

1 个答案:

答案 0 :(得分: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.