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

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

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

Моя текущая схема показана ниже на картинке: Моя схема базы данных для представления продуктов, принадлежащих к подкатегориям. Каждый продукт имеет определенное количество функций.

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

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

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

Ура

1
pokey909 26 Авг 2011 в 02:41

3 ответа

Лучший ответ

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

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

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

1
Grant Sayer 26 Авг 2011 в 03:45

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

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
Harish Shetty 26 Авг 2011 в 02:56

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

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

Для присоединения "многие ко многим" вам нужно будет посмотреть

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

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

0
Paul.s 25 Авг 2011 в 23:08