Моделирование самореферентных коллекций в Rails

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

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

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

  • product_id — основной или исходный продукт, отображаемый на странице сведений.
  • наряд_ид - сопутствующий товар или аксессуар

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

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

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

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

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

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


person Najitaka    schedule 01.05.2010    source источник


Ответы (1)


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

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.
person Harish Shetty    schedule 01.05.2010
comment
Отлично, я ожидал, что это сработает, но я никогда не понимал из других примеров, что я могу создавать/удалять строки Ensemble на основе нарядов. Я всегда пытался работать с самой строкой ансамбля. Спасибо за ясность. - person Najitaka; 01.05.2010