如何划分和匹配所有类别

时间:2018-12-24 12:35:50

标签: ruby-on-rails

我有一个要根据类别过滤的组列表。

例如: 组#1具有“类别A”和“类别B” 组#2具有“类别B”和“类别C”

现在,如果我搜索“类别A”,则会出现第1组。如果我搜索“类别B”和“类别C”,则这两个组都会出现。

如何在Rails中使用合并范围,如果我搜索“类别B”和“类别C”,则仅显示第2组?

组模型

class Group < ApplicationRecord
  has_many :group_categories
  has_many :categories, through: :group_categories

  scope :category, -> (category) { joins(:categories).where(categories {name: category}) }
end

类别模型

class Category < ApplicationRecord
  validates :name, presence: true
end

GroupCategory模型

class GroupCategory < ApplicationRecord
  belongs_to :category
  belongs_to :group
end

1 个答案:

答案 0 :(得分:0)

您无法进行直链操作,因为Group.category('A').category('B')将只返回类别名称均为“ A”和“ B”且类别不可能的组(名称只能有一个值)

您可以分多个步骤进行操作,获取每个类别匹配的ID,然后执行intersection以获取两个组的通用ID。

ids = Group.category('A').pluck(:id) & Group.category('B').pluck(:id) 
Group.where(id: ids)

要制作一个适用于任意数量类别的Group方法,您可以...

def self.matching_categories(*category_array)
  ids = category_array.map{|category| Group.category(category}.pluck(:id)}.inject(:&)
  Group.where(id: ids)
end

哪个可以让您...

Group.matching_categories('A', 'B')