Rails:将多个过滤器链接在一起,因为有很多 through: 关系

Rails: chaining multiple filters together for has many through: relationships

我需要一些帮助来链接一些涉及 has many through 关系的过滤器。 一些背景:

  1. 我有一个名为 product 的模型。一个产品有很多类别。反之亦然,一个类别可以有很多产品。
  2. 我有一个叫colours的模型,一个产品可以有多种颜色。这 2 个也通过许多直通关系链接。

我的主要目标是以某种方式能够根据类别 颜色过滤项目。我通过 form.This 接收用户的输入意味着在控制器中做一些事情,比如

@products= Product.includes(:categories).includes(:colours)
        .where(categories: {id: params[:item][:category_ids]})
        .where(colours: {id: params[:item][:colour_ids]})

然而,这个解决方案除了是真正的 janky 之外还有很多问题。另外,如果用户没有传入任何过滤器,它只会使用 nils"" 进行过滤。 有没有更好的方法通过这样的关系链接多个有很多?我一直在尝试寻找有关如何在线执行此操作的任何提示,但我仍然对在这里做什么一无所知。任何帮助将非常感激。此外,如果需要任何其他代码,我可以编辑此 post。

你的实现看起来很不错)。但我会建议你这个。如果您只需要过滤产品,那么您可以调用 left_joins 并将您的连接表(products_categoriesproducts_colours)而不是目标表传递给那里。为什么?因为它将减少 sql 查询中的 LEFT JOIN 子句并且不会将对象加载到内存中,因此您将提高性能。但只有当您不需要通过您的产品并采用他的 categoriescolours 时,它才会起作用。 所以查询看起来像。

Product
  .left_joins(:products_categories, :products_colours)
  .where(products_categories: { category_id: params[:item][:category_ids].presence || Category.ids } )
  .where(products_colours: { colour_id: params[:item][:colour_ids].presence || Colour.ids }