按类别过滤使用rails

时间:2017-12-01 13:29:28

标签: ruby-on-rails ruby postgresql activerecord rails-activerecord

我有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。希望得到你的帮助)

1 个答案:

答案 0 :(得分:1)

您可以使用grouphaving

来实现这一目标
scope :filter, -> (category_ids) { 
  return unless category_ids.present?
  includes(:categories).where(categories: { id: category_ids })
                       .group(:id).having("count(*) = ? ", category_ids.size)
}