Ruby on rails Rails:将的多个筛选器链接在一起具有多个到:关系
我需要一些帮助来链接一些过滤器,这些过滤器涉及到很多贯穿关系。 一些背景:Ruby on rails Rails:将的多个筛选器链接在一起具有多个到:关系,ruby-on-rails,model,has-many-through,Ruby On Rails,Model,Has Many Through,我需要一些帮助来链接一些过滤器,这些过滤器涉及到很多贯穿关系。 一些背景: 我有一个模型叫product。一个产品有很多种类。反之亦然,一个类别可以有许多产品 我有一个叫颜色的模型,一个产品可以有多种颜色。这两个也通过有许多通过关系而联系在一起 我的主要目标是能够以某种方式根据类别和颜色过滤项目。我通过一个表单接收来自用户的输入。这意味着在控制器中执行类似的操作 @products= Product.includes(:categories).includes(:colours)
@products= Product.includes(:categories).includes(:colours)
.where(categories: {id: params[:item][:category_ids]})
.where(colours: {id: params[:item][:colour_ids]})
然而,这种解决方案除了令人讨厌之外还有很多问题。另外,如果用户没有通过任何过滤器,它只会使用nils
或“
进行过滤。
有没有更好的方法通过这样的关系链接多个has many?我一直试图在网上找到一些关于如何做到这一点的提示,但我仍然不知道该怎么做。任何帮助都将不胜感激。此外,如果需要任何额外的代码,我可以编辑这篇文章。您的实现看起来相当不错)。但我建议你这样做。如果您只需要筛选产品,则可以调用
左连接
,并将连接表(产品类别
,产品颜色
)传递到那里,而不是目标表。为什么?因为它将减少sql查询中的LEFT JOIN
子句,并且不会将对象加载到内存中,因此可以提高性能。但是,只有当你不需要检查你的产品,不需要查看他的类别
或颜色
时,它才会起作用。
所以查询看起来像
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 }