Наличие категории для отдельного продукта кажется хорошим подходом. Так как ваш Category
отличается в зависимости от атрибутов. Что вы можете сделать, это создать еще одну модель, скажем: MasterCategory
, которая имеет много Category
, а Category
принадлежит MasterCategory
, что означает для вас MasterCategory
Cars
вы ' Вы получите Audi, BMW, Nissan etc etc. categories
, а затем свяжете ваши продукты с соответствующими поставщиками в таблице products_categories
, в которой будет product_id, category_id
.
По моему мнению, схема может выглядеть следующим образом:
ProductsCategory:
product_id, category_id
MasterCategory:
id, name, created_at, updated_at
Category:
id, master_category_id, parent_id, name, position, name, permalink
Например, - A car
MasterCategory будет выглядеть так:
#<MasterCategory id: 1, name: "cars", created_at: "2012-02-14 13:03:45", updated_at: "2012-02-14 13:03:45">
и categories
будет:
[#<Category id: 1, master_category_id: 1, parent_id: nil, position: 0, name: "cars", created_at: "2012-02-14 13:03:45", updated_at: "2012-02-14 13:03:45", permalink: "cars">, #<Category id: 2, master_category_id: 1, parent_id: 1, position: 0, name: "Audi", created_at: "2012-02-14 13:03:45", updated_at: "2012-02-14 13:32:51", permalink: "cars/audi">]
Теперь вы можете использовать два метода parent
и children
в вашей Category
модели, используя атрибут parent_id
для легкого поиска и перемещения по master и подкатегориям . И вы можете использовать атрибут permalink
, чтобы легко найти категорию, которая относится к другой категории с одним запросом: Category.find_by_permalink(params[:permalink])
и может отображать все продукты, связанные с этой конкретной категорией. В будущем, когда вы будете масштабироваться, могу поспорить, вам понадобится этот атрибут position
, чтобы управлять положением ваших категорий для отображения на вашей странице. И в последнем master_category_id
даст вам легкость в жизни с:
car = MasterCategory.find(1)
car.categories.where("parent_id IS NOT NULL")
Всего наилучшего !! :)