如何搜索关联,只有它们存在(所以不使用连接)

时间:2018-04-18 13:03:32

标签: ruby-on-rails activerecord

我们说我有一个有头衔的订单。 Order有一个名称可选的公司。 Order还有多个LineItem,它们连接到具有名称的Products。

我想创建一个搜索功能,允许用户查询Order.title,Company.name和/或Products.name。如果订单没有连接的公司或产品,则不应阻止其匹配。

例如,这不起作用,因为如果没有公司,即使Order.name匹配,它也不会返回,因为联接不起作用。

base.OnModelCreating(modelBuilder)

1 个答案:

答案 0 :(得分:1)

当您仅使用joins时,Rails会执行内部联接。您可以使用left_joins,以便即使关联不存在,查询也会返回行:

Order.left_joins([:company, {line_items: [:product]}]).
      where("orders.name = ? OR company.name = ? OR product.name = ?", query)

根据max建议,如果您要使用这些嵌套关联中的某些值(例如公司名称或类似名称),我建议您使用eager_load代替left_joins,因此rails将从这些表中加载数据,这将避免其他查询

我还建议,由于您正在进行搜索,要将您的列和查询大写,因此它不会区分大小写。另外,使用LIKE代替EQUAL比较器会更好(因此即使它没有完全匹配也会返回记录)。这样的事情会更好:

Order.left_joins([:company, {line_items: [:product]}]).
      where("UPPER(orders.name) LIKE ? OR UPPER(company.name) LIKE ? OR UPPER(product.name) LIKE ?", query.upcase)

希望这有帮助!