项目 - 项目关系的Rails模型关联?

时间:2010-02-19 00:29:15

标签: ruby associations models rails-models

寻找有关实施此方案的最佳方式的一些指导:

我有一个商品表(产品),并希望支持交叉销售/向上销售/补充商品的能力。所以这里有一个项目到项目的关系。在这个连接表中,我需要在键之外包含其他属性,例如项目之间的sales_relation(例如,交叉,向上,补充,替换等)。

如何设置模型关联?

2 个答案:

答案 0 :(得分:3)

通过它的声音,这个连接表代表了一个全新的模型。我不确定你的要求是什么,但我会发挥一个潜在的解决方案。现在,让我们将连接模型称为SalesRelationship。

我打算将产品/产品对象称为“产品”,因为对我来说它不那么通用了。

此迁移看起来像:

class CreateSalesRelationship < ActiveRecord::Migration
  def self.up
    create_table :sales_relationship |t|
      t.string :product_id
      t.string :other_product_id
      t.string :type
      t.timestamps
    end
  end

  def self.down
    drop_table :sales_relationship
  end
end

您还可以包含该迁移中所需的任何其他属性。接下来,创建SalesRelationship模型:

class SalesRelationship < ActiveRecord::Base
  belongs_to :product
  belongs_to :other_product, :class_name => "Product
end

然后,为不同类型的关系创建子类:

class CrossSell < SalesRelationship
end

class UpSell < SalesRelationship
end

class Complement < SalesRelationship
end

class Substitute < SalesRelationship
end

然后在产品型号上设置关系:

class Product < ActiveRecord::Base
  has_many :sales_relationships, :dependent => :destroy
  has_many :cross_sells
  has_many :up_sells
  has_many :complements
  has_many :substitutes

  has_many :cross_sale_products, :through => :cross_sells, :source => :other_product
  has_many :up_sale_products, :through => :up_sells, :source => :other_product
  has_many :complementary_products, :through => :complements, :source => :other_product
  has_many :substitute_products, :through => :substitutes, :source => :other_product
end

现在,您应该可以创建和添加所需的相关产品。

@product1.substitute_products << @product2
new_product = @product2.complementary_products.build

要获得额外的功劳,您可以在SalesRelationship模型上编写一个简单的验证,确保产品永远不会与自身相关。根据您的要求,这可能是必要的,也可能不是必需的。

答案 1 :(得分:0)

这样的事情:

has_many :other_item, :class_name => "Item", :through => :item_to_item

表item_to_item会像这样

| item_id | other_item_id | complement | substitute | etc...

您必须编写自定义属性访问器,以确保item_id始终为&lt; other_item_id以避免重复的问题。

如果您不太明白我的意思,请随时提出更多问题。