【问题标题】:Rails: chaining multiple filters together for has many through: relationshipsRails:将多个过滤器链接在一起有很多通过:关系
【发布时间】:2021-08-11 14:01:30
【问题描述】:

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

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

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

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

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

【问题讨论】:

    标签: ruby-on-rails model has-many-through


    【解决方案1】:

    您的实现看起来相当不错)。但我建议你这样做。如果您只需要过滤产品,那么您可以调用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 }
    

    【讨论】:

      猜你喜欢
      • 2023-04-09
      • 1970-01-01
      • 2019-05-24
      • 1970-01-01
      • 1970-01-01
      • 2014-02-12
      • 2017-09-03
      • 2011-07-13
      • 1970-01-01
      相关资源
      最近更新 更多