cod*_*ing 2 activerecord ruby-on-rails
使用RoR ORM,您将如何映射此模型.
Categories
-id
Products
-id
CategoriesProducts
-category_id
-product_id
Run Code Online (Sandbox Code Playgroud)
所以我想执行以下查询:
category.products.all
product.category.id
Run Code Online (Sandbox Code Playgroud)
在rails中,您如何确定将关系的哪一方用于将产品添加到类别中?
会是这样的:
category.add_product(product)
Run Code Online (Sandbox Code Playgroud)
要么
product.add_category(category)
Run Code Online (Sandbox Code Playgroud)
如果我想获取id为234,24,431,214和产品的所有类别,有什么方法可以做到这一点,而不会遇到n + 1查询问题?
最简单的方法,使用has_and_belongs_to_many.确保在创建CategoriesProucts表时,您创建的迁移文件没有ID:
create_table :categories_products, :id => false do |t|
Run Code Online (Sandbox Code Playgroud)
然后您的cateogry模型应如下所示:
class Category < ActiveRecord::Base
has_and_belongs_to_many :products
end
Run Code Online (Sandbox Code Playgroud)
您的产品型号应如下所示:
class Product < ActiveRecord::Base
has_and_belongs_to_many :categories
end
Run Code Online (Sandbox Code Playgroud)
这是另一种方法.如果您想稍后再修改一些控件,这也可以使用.在您的CategoriesProduct模型上:
class CategoriesProduct < ActiveRecord::Base
belongs_to :category
belongs_to :product
end
Run Code Online (Sandbox Code Playgroud)
在您的类别模型上:
class Category < ActiveRecord::Base
has_many :categories_products
has_many :products, :through => :categories_products
end
Run Code Online (Sandbox Code Playgroud)
在您的产品型号上:
class Product < ActiveRecord::Base
has_many :categories_products
has_many :categories, :through => :categories_products
end
Run Code Online (Sandbox Code Playgroud)
然后你应该能够做到:
Category.create(:name => "Cat1")
Category.first.products.create(:name => "Prod1")
Product.first.categories.create(:name => "Cat2")
Run Code Online (Sandbox Code Playgroud)
等等...
该infograph可能有助于可视化概念.
| 归档时间: |
|
| 查看次数: |
2052 次 |
| 最近记录: |