使用 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 查询问题?
最佳答案
最简单的方法是使用has_and_belongs_to_many
。确保在创建 CategoryProucts 表时,创建的迁移文件不带 id:
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")
等等...
This infograph可能有助于形象化这个概念。
关于ruby-on-rails - activerecord 中的类别和产品映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7822651/