Модель самоссылочных коллекций в Rails - PullRequest
0 голосов
/ 01 мая 2010

Я написал заявку на интернет-магазин одежды в Rails 2.3.5. Я хочу показывать похожие продукты, когда клиент просматривает страницу сведений о продукте.

Например, если клиент просматривает страницу с описанием костюма, я хотел бы отобразить аксессуары, которые соответствуют платью, такие как жилет, обувь и пояс. Я назвал сопутствующие товары ансамблем. Тем не менее, жилет, обувь и ремни также являются продуктами, из-за которых я изо всех сил.

У меня это работает следующим образом, но я знаю, что это не путь Rails. У меня есть таблица продуктов для всех продуктов. Не важно здесь, но у меня также есть таблица ProductDetails. У меня есть таблица ансамблей, которая имеет следующие столбцы:

  • product_id - основной или исходный продукт, отображаемый на странице сведений
  • outfit_id - связанный или вспомогательный продукт

При настройке данных в списке продуктов для каждого продукта у меня есть ансамблевая ссылка. Эта ссылка приводит вас к действию index в контроллере Ensembles.

Используя идентификатор из "основного" продукта, я нахожу все связанные строки ансамбля по product_id или создаю новый ансамбль и назначаю идентификатор основного продукта как product_id. Я хотел бы просто иметь возможность делать @ product.related_products для получения коллекции Ensemble.

Также на странице указателя я перечисляю столбцы основного продукта, чтобы пользователь мог быть уверен, что его основным продуктом был тот, который он выбрал из списка. У меня также есть список выбора других продуктов с действием «Добавить в ансамбль».

Наконец, на той же индексной странице у меня есть таблица, в которой отображаются продукты, которые уже есть в ансамбле, и в этом списке в каждой строке есть ссылка уничтожения для удаления определенного продукта из ансамбля. Было бы неплохо, если бы при наличии одной строки ансамбля @ensemble я мог бы сделать @ ensemble.product, чтобы получить Продукт, связанный с outfit_id строки ансамбля.

У меня это работает без ассоциаций, но мне нужно запускать запросы в контроллере для создания моих собственных коллекций @product, @ensemble и @ensembles. Также я нашел единственный способ уничтожить строку ансамбля с помощью Ensemble.connection.delete (sql для удаления), простой @ ensemble.destroy не работает.

Кто-нибудь знает, как я могу установить ассоциации или иметь ссылку на сайт, объясняющий аналогичную настройку. Ни один из найденных примеров не использует ту же таблицу. У них есть буква A, связанная с B до C. Я хочу, чтобы буква A относилась к другим от A до B.

1 Ответ

2 голосов
/ 01 мая 2010

Установите свои ассоциации следующим образом:

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.
...