ruby-on-rails - activerecord 中的类别和产品映射

标签 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 查询问题?

最佳答案

最简单的方法是使用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/

相关文章:

ruby-on-rails - 重新启动 spork 服务器后出现未定义方法 'instantiate_observers' 错误

ruby-on-rails - 在 View 中将 ajax 从一个部分实现到另一个部分的问题

ruby-on-rails - ActiveRecord #find 错误的对象类

ruby-on-rails - ActiveRecord 关联和范围哦天哪

ruby-on-rails - 如何发布到 Rails Controller 中的连接表

ruby-on-rails - 没有 ActiveRecord 的 form_for,表单操作不更新

ruby-on-rails - 条件 View /布局

sql - ActiveRecord::Base.connection 和 find_by_sql 之间的区别

ruby-on-rails - 何时使用关联扩展与命名范围?

ruby-on-rails - Rails 中的多个查询条件 - 如果它们存在。