activerecord中的类别和产品映射

时间:2011-10-19 14:14:21

标签: ruby-on-rails activerecord

使用RoR ORM,您将如何映射此模型。

Categories
-id

Products
-id

CategoriesProducts
-category_id
-product_id

所以我想执行以下查询:

category.products.all
product.category.id

在rails中,您如何确定将关系的哪一方用于将产品添加到类别中?

会是这样的:

category.add_product(product)

product.add_category(category)

如果我想获取ID为234,24,431,214和产品的所有类别,有什么方法可以做到这一点,而不会遇到n + 1查询问题?

3 个答案:

答案 0 :(得分:9)

最简单的方法,使用has_and_belongs_to_many。确保在创建CategoriesProucts表时,您创建的迁移文件没有id:

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

然后你的cateogry模型应如下所示:

class Category < ActiveRecord::Base
  has_and_belongs_to_many :products
end

您的产品型号应如下所示:

class Product < ActiveRecord::Base
  has_and_belongs_to_many :categories
end

这是另一种方法。如果您想稍后再修改一些控件,这也可以使用。在您的CategoriesProduct模型上:

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")

等...

This infograph可能有助于可视化概念。

答案 1 :(得分:2)

创建表categories_products,categories和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

答案 2 :(得分:1)

在决定如何重新获取数据方面,这取决于您和您对数据的影响。

例如,在categories_controller中,通过产品类别更有意义,反之亦然。

要获得某些类别的所有产品,您可以将其结合起来:

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

(或类似的,我没有测试过这个)。这将对Categories进行一次查询,对产品进行一次查询。