【问题标题】:Filtering by categories with rails使用导轨按类别过滤
【发布时间】:2017-12-01 13:29:27
【问题描述】:

我有2个模型Recipe和Category,它们与has_and_belongs_to_many关联,现在我需要按类别过滤食谱,当用户检查类别时,我会收到检查的类别ID数组,并创建一个过滤食谱的范围,如下所示:

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_id 匹配,它就会返回食谱,例如,如果用户检查了早餐和沙拉,我的过滤器会返回所有早餐和所有沙拉,但我只需要包含这两个类别的食谱早餐和沙拉。我可以使用 activerecord 执行此操作吗?查询 db 的外观应该如何?我正在使用 rails 5 和 postgresql。希望得到您的帮助)

【问题讨论】:

  • group(:recipe_id).having("count(*) = ? ", category_ids.size)?
  • 我将 :recipe _id 替换为 :id 并且效果很好。谢谢!非常喜欢!)

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


【解决方案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)
}

【讨论】:

    猜你喜欢
    • 2021-05-18
    • 2021-06-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-19
    • 1970-01-01
    • 2020-11-10
    • 2021-11-15
    相关资源
    最近更新 更多