Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails:将的多个筛选器链接在一起具有多个到:关系_Ruby On Rails_Model_Has Many Through - Fatal编程技术网

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)

我需要一些帮助来链接一些过滤器,这些过滤器涉及到很多贯穿关系。 一些背景:

  • 我有一个模型叫product。一个产品有很多种类。反之亦然,一个类别可以有许多产品
  • 我有一个叫颜色的模型,一个产品可以有多种颜色。这两个也通过有许多通过关系而联系在一起
  • 我的主要目标是能够以某种方式根据类别和颜色过滤项目。我通过一个表单接收来自用户的输入。这意味着在控制器中执行类似的操作

    @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 }