Думаю, у меня довольно простой вопрос, так как я новичок в Ruby и даже новичок в ActiveRecords.
Я хочу добиться представления класса с ActiveRecords (и соответствующей схемой SQL), которое моделирует следующую проблему:
- Существуют категории и подкатегории (смоделированы с помощью parent_id)
- Товары относятся только к одной категории
- Каждый продукт может иметь 0..inf функций.
- У функций просто есть несколько полей данных, и на них ссылаются только продукты.
Моя текущая схема показана ниже на картинке:
Подходит ли эта схема для ActiveRecords? Как бы выглядели классы? Я просто не могу понять, как JoinTable вписывается в структуру ActiveRecord.
Кроме того, как я могу смоделировать ссылку из parent_id->categories.id
?
Любая помощь приветствуется!
Ура
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: Ассоциации на хорошем примере. Остальная часть этого руководства также подробно описывает другие отношения.
Еще одна вещь, о которой следует помнить, - создавать свои миграции так, чтобы таблица соединений создавалась с идентификаторами, которые являются внешними ключами.
Мои модели будут выглядеть так:
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
Вот API для ActiveRecord :: Associations :: ClassMethods
Там есть много примеров различных отношений и способов их построения. Стоит потратить время на то, чтобы понять, как и почему вы строите эти ассоциации.
Для присоединения "многие ко многим" вам нужно будет посмотреть
has_many ..., :through => ...
has_and_belongs_to_many ...
В документации объясняется, когда и зачем использовать каждый из них.
Похожие вопросы
Новые вопросы
sql
Язык структурированных запросов (SQL) - это язык запросов к базам данных. Вопросы должны включать примеры кода, структуру таблицы, примеры данных и тег для используемой реализации СУБД (например, MySQL, PostgreSQL, Oracle, MS SQL Server, IBM DB2 и т. Д.). Если ваш вопрос относится исключительно к конкретной СУБД (использует определенные расширения / функции), используйте вместо этого тег этой СУБД. Ответы на вопросы, помеченные SQL, должны использовать стандарт ISO / IEC SQL.