所以我想说我有一个产品和类别模型。它们之间存在一对多的关系(类别有很多产品,产品属于类别)。 我使用命名范围基于某些标准创建了一个类别集合。让我们称这个集合为A. 然后我想创建一个属于集合A中任一类别的产品集合。
我该怎么做?
我的猜测是使用集合A(A.ids)的ID并使用map或lambda来检查产品的category_id是否包含在我从集合A构建的id数组中。我不知道如何要做到这一点,如果是达到最终结果的最有效方式。
答案 0 :(得分:1)
我建议您安排这样的模型:
class Category
has_many :products
has_many :category_collections
end
class CategotyCollection
belongs_to :category
belongs_to :collection
end
class Collection
has_many :category_collections
has_many :categories, through: :category_collections
has_many :products, through: :categories
端
在一天结束时,您可以选择给定集合中的产品:
collection = CategoryCollection.first
collection.categories # => all categories in this collection
collection.products # => all products in this collection
答案 1 :(得分:1)
我很想使用has_many :through
关系,虽然它实际上只是一个需要的“加入”模型:
我最初想到的是has_and_belongs_to_many
关系,但是无法辨别出不同的类别。
-
#app/models/collection.rb
class Collection < ActiveRecord::Base
#columns id | name | category_id | product_id
belongs_to :category
belongs_to :product
end
拥有这样的Collection
模型将使您能够调用以下内容:
@collection = Collection.find_by name: "New products"
@collection.categories #-> all categories
@collection.products #-> all products
这样您就可以将products
和categories
关联起来,如下所示:
#app/models/product.rb
class Product < ActiveRecord::Base
has_many :categories
has_many :collections
has_many :collection_categories, through: :collections
end
#app/models/category.rb
class Category < ActiveRecord::Base
has_many :products
has_many :collections
has_many :collection_products, through: :collections
end
更改Product
和Category
模型是可选的。如果您想要以下内容,那就是:
@category = Category.find "1"
@category.collection_products # -> pulled from collections (IE not the `has_many/belongs_to` relationship you have now.
@product = Product.find "2"
@product.collection_categories # -> all categories through the collections table
答案 2 :(得分:1)
加入关联,按相关对象进行过滤(joins
/ merge
组合)
Product.joins(:category).merge(Category.whatever_scope(you, have))
关联的子查询
Product.where(category: Category.whatever_scope(you, have))
答案 3 :(得分:0)
当您说“您想要创建一个属于 类别的产品系列”时,它会自动使其成为多个许多关系。实际上,一个产品可以属于许多类别,一个类别可以有许多产品。因此,我会创建一个连接表来解决您的问题。
答案 4 :(得分:0)
最简单的方法是使用ID并使用它们来选择产品。
category_ids = Category.some_scope.pluck(:id)
products_collection = Product.where(category_id: category_ids)
除非并非总是如此 - 您需要从多个类别中选择产品 - 那么也许您应该采用收集模式的方式,建议@dimakura