我有2个模型Recipe和Category,它们与has_and_belongs_to_many相关联,现在我需要按类别过滤食谱,当用户检查类别时,我会查看已检查类别ID的数组,并创建一个过滤食谱的范围,如下所示: / p>
scope :filter, -> (category_ids){ includes(:categories).where(categories: {id: category_ids}) if category_ids.present? }
并在配方控制器中使用此范围
Recipe.filter(params_index[:category_ids])
私有
def params_index
params.permit(category_ids: [])
end
问题是,如果任何类别id与用户传递的category_ids匹配,它会返回配方,例如,如果用户选中了早餐和沙拉,我的过滤器返回所有早餐和所有沙拉,但我只需要包含两个类别的那些食谱早餐和沙拉。我可以使用activerecord执行此操作,应该如何查询到db?我正在使用rails 5和postgresql。希望得到你的帮助)
答案 0 :(得分:1)
您可以使用group
和having
:
scope :filter, -> (category_ids) {
return unless category_ids.present?
includes(:categories).where(categories: { id: category_ids })
.group(:id).having("count(*) = ? ", category_ids.size)
}