Rails查找属于类别集

时间:2015-09-22 07:32:30

标签: sql ruby-on-rails activerecord one-to-many

所以我想说我有一个产品和类别模型。它们之间存在一对多的关系(类别有很多产品,产品属于类别)。 我使用命名范围基于某些标准创建了一个类别集合。让我们称这个集合为A. 然后我想创建一个属于集合A中任一类别的产品集合。

我该怎么做?

我的猜测是使用集合A(A.ids)的ID并使用map或lambda来检查产品的category_id是否包含在我从集合A构建的id数组中。我不知道如何要做到这一点,如果是达到最终结果的最有效方式。

5 个答案:

答案 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关系,虽然它实际上只是一个需要的“加入”模型:

enter image description here

我最初想到的是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

这样您就可以将productscategories关联起来,如下所示:

#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

更改ProductCategory模型是可选的。如果您想要以下内容,那就是:

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

  1. 加入关联,按相关对象进行过滤(joins / merge组合)

    Product.joins(:category).merge(Category.whatever_scope(you, have))
    
  2. 关联的子查询

    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