我有一个要根据类别过滤的组列表。
例如: 组#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
答案 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')