我们说我有一个有头衔的订单。 Order有一个名称可选的公司。 Order还有多个LineItem,它们连接到具有名称的Products。
我想创建一个搜索功能,允许用户查询Order.title,Company.name和/或Products.name。如果订单没有连接的公司或产品,则不应阻止其匹配。
例如,这不起作用,因为如果没有公司,即使Order.name匹配,它也不会返回,因为联接不起作用。
base.OnModelCreating(modelBuilder)
答案 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)
希望这有帮助!