Rails:将多个过滤器链接在一起,因为有很多 through: 关系
Rails: chaining multiple filters together for has many through: relationships
我需要一些帮助来链接一些涉及 has many through 关系的过滤器。
一些背景:
- 我有一个名为 product 的模型。一个产品有很多类别。反之亦然,一个类别可以有很多产品。
- 我有一个叫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_categories
、products_colours
)而不是目标表传递给那里。为什么?因为它将减少 sql 查询中的 LEFT JOIN
子句并且不会将对象加载到内存中,因此您将提高性能。但只有当您不需要通过您的产品并采用他的 categories
或 colours
时,它才会起作用。
所以查询看起来像。
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 }
我需要一些帮助来链接一些涉及 has many through 关系的过滤器。 一些背景:
- 我有一个名为 product 的模型。一个产品有很多类别。反之亦然,一个类别可以有很多产品。
- 我有一个叫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_categories
、products_colours
)而不是目标表传递给那里。为什么?因为它将减少 sql 查询中的 LEFT JOIN
子句并且不会将对象加载到内存中,因此您将提高性能。但只有当您不需要通过您的产品并采用他的 categories
或 colours
时,它才会起作用。
所以查询看起来像。
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 }