Судя по всему, эта таблица соединений представляет собой совершенно новую модель. Я точно не знаю, каковы ваши требования, но я разыграю одно из возможных решений. А пока давайте назовем модель соединения 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, которая гарантирует, что продукт никогда не будет связан с самим собой. Это может или не может быть необходимым, в зависимости от ваших требований.