Таблица и Ruby ActiveRecord Class дизайн для (под) категорий - PullRequest
1 голос
/ 26 августа 2011

Полагаю, у меня довольно простой вопрос, так как я новичок в Ruby и еще новее в ActiveRecords.

Чего я хочу достичь, так это представления классов с ActiveRecords (и соответствующей схемой SQL), которые моделируютследующая проблема:

  • Существуют категории и подкатегории (смоделированы parent_id)
  • Продукты принадлежат только одной категории
  • Каждый продукт может иметь 0..инф функций
  • Элементы просто имеют некоторые поля данных и на них ссылаются только продукты

Моя текущая схема показана ниже на рисунке: My database schema for representing products belonging to sub(categories). Each product has a certain number of Features.

Является ли эта схемаподходит для ActiveRecords?Как будут выглядеть классы?Я просто не могу понять, как JoinTable вписывается в структуру ActiveRecord.

Далее, как я могу смоделировать ссылку из parent_id->categories.id?

Любая помощь приветствуется!

ура

Ответы [ 3 ]

1 голос
/ 26 августа 2011

Мои модели выглядят так:

class Category < ActiveRecord::Base
  has_many :products
end

class Product < ActiveRecord::Base
  belongs_to :category
  has_many   :product_features
  has_many   :features, :through => :product_features
end

class ProductFeature  < ActiveRecord::Base
  belongs_to :product
  belongs_to :feature
end

class Feature < ActiveRecord::Base
  has_many   :product_features
  has_many   :products, :through => :product_features
end

У Rails есть ассоциация под названием has_and_belongs_to_many.Rails ожидает таблицу с двумя столбцами для хранения данных соединения.Я обычно использую двойной has_many для достижения тех же результатов, поскольку это дает вам гибкость при добавлении дополнительной информации в таблицу соединений.

Пример кода

product.category
product.category = category1


category.products
category.products << product1


product.features
product.features << feature1

feature.products
feature.products << product1
1 голос
/ 26 августа 2011

Чтобы смоделировать отношения, которые вы описали, вы должны сделать:

models/category.rb
class Category < ActiveRecord::Base
    has_many :products
    has_many :subcategories, :class_name => "Category", :foreign_key => :parent_id
end

models/product.rb
class Product < ActiveRecord::Base
    belongs_to :product
    has_many :features, :through => :product_features
    has_many :product_features
end

models/feature.rb
class Feature < ActiveRecord::Base
  has_many :product_features
  has_many :products, :through => :product_features
end

models/productfeature.rb
class ProductFeature < ActiveRecord::Base
  belongs_to :product
  belongs_to :feature
end

Учитывая эту структуру, у вас есть соединение, смоделированное как отношение «многие ко многим». Это полезно, так как стиль соединения HABTM в Rails 3.1

исчезает

Чтобы получить информацию, я часто использую консоль rails console для тестирования, и это позволит вам сделать

@category = Category.first   #get the first category
@category.subcategories      #returns an array of categories

Обход ссылок осуществляется через отношения, которые вы устанавливаете в моделях, с намерением, чтобы его можно было прочитать , в контексте использования разумных имен. Самостоятельные соединения, согласно вашему вопросу, также описаны в Rails Guides: Ассоциации с хорошим примером. В остальной части этого руководства также подробно описываются другие отношения.

Еще одна вещь, которую нужно помнить, - это создать ваши миграции, чтобы таблица соединений создавалась с идентификаторами, которые являются внешними ключами.

0 голосов
/ 26 августа 2011

Вот API для ActiveRecord :: Associations :: ClassMethods

Существует множество примеров различных отношений и способов их построения.Стоит потратить время на то, чтобы понять, как / почему вы строите эти ассоциации.

Для объединения «многие ко многим» вы захотите взглянуть на

  • has_many ..., :through => ...
  • has_and_belongs_to_many ...

В документах объясняется, когда и зачем использовать каждый из них.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...