Связи модели рельсов для связи предмет-предмет? - PullRequest
1 голос
/ 19 февраля 2010

Ищите несколько советов о том, как лучше реализовать этот сценарий:

У меня есть таблица предметов (продуктов), и я хочу поддерживать возможность перекрестной продажи / продажи / дополнения предметов. Таким образом, здесь есть отношение элемент к элементу. В эту таблицу соединений мне нужно включить дополнительные атрибуты, помимо ключей, такие как sales_relation между элементами (например, пересечение, увеличение, дополнение, замена и т. Д.).

Как мне установить ассоциации моделей?

Ответы [ 2 ]

3 голосов
/ 19 февраля 2010

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

0 голосов
/ 19 февраля 2010

Примерно так:

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

Таблица item_to_item будет выглядеть следующим образом

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

Вам нужно написать собственный метод доступа к атрибутам, который гарантирует, что item_id всегда

Не стесняйтесь спрашивать больше, если вы не совсем понимаете, что я имею в виду здесь.

...