Категория и сопоставление товаров в activerecord - PullRequest
2 голосов
/ 19 октября 2011

С RoR ORM, как бы вы отобразили эту модель.

Categories
-id

Products
-id

CategoriesProducts
-category_id
-product_id

Итак, я хочу выполнить такие запросы, как:

category.products.all
product.category.id

В рельсах, как вы решаете, какая сторона отношений будет использоваться для добавления товаров в категорию?

Будет ли это как:

category.add_product(product)

или

product.add_category(category)

А что, если я хочу получить все категории с идентификатором 234,24,431,214 и продуктами, есть ли способ сделать это без проблем с запросом n + 1?

Ответы [ 3 ]

9 голосов
/ 19 октября 2011

Самый простой способ сделать это, используйте has_and_belongs_to_many.Убедитесь, что при создании таблицы CategoriesProucts файл миграции создается без идентификатора:

create_table :categories_products, :id => false do |t|

Тогда ваша модель категрии должна выглядеть следующим образом:

class Category < ActiveRecord::Base
  has_and_belongs_to_many :products
end

И модель вашего продуктадолжно выглядеть так:

class Product < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

Вот еще один метод.Это также будет работать, если вы хотите иметь больше контроля над изменениями позже.В вашей категории Модель продукта:

class CategoriesProduct < ActiveRecord::Base
  belongs_to :category
  belongs_to :product
end

В вашей модели Категория:

class Category < ActiveRecord::Base
  has_many :categories_products
  has_many :products, :through => :categories_products
end

В модели вашего продукта:

class Product < ActiveRecord::Base
  has_many :categories_products
  has_many :categories, :through => :categories_products
end

Тогда вы сможете выполнить:

Category.create(:name => "Cat1")
Category.first.products.create(:name => "Prod1")
Product.first.categories.create(:name => "Cat2")

и т.д ...

Эта инфографика может быть полезна для визуализации концепции.

2 голосов
/ 20 октября 2011

Создайте таблицу category_products, Categories and products и создайте модальные для Category и Products.

Имейте отношение has_and_belongs_to_many в обоих модалахЭто должно позволить вам использовать такие методы, как @ category.products (чтобы получить все продукты для определенной категории) и @ product.categories (чтобы получить все категории для этого продукта).

Также посмотрите на эти:http://guides.rubyonrails.org/association_basics.html#the-has_and_belongs_to_many-association http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_and_belongs_to_many

1 голос
/ 19 октября 2011

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

Например, в контроллере category_conler будет более разумно проходить через категории к продуктам, и наоборот для продуктов.

Чтобы получить все товары для определенных категорий, вы можете объединить это:

Category.where("id IN (?)", [1,2,3,4,5,6]).includes(:products)

(или подобное, я не проверял это). Это сделает один запрос для категорий и один для продуктов.

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