Rails - 如何使用Textacular对多个表进行模糊搜索?

Rails - How to Perform Fuzzy Search on Multiple Tables using Textacular?

我正在使用 textacular gem 在我的 Rails 应用程序中实现模糊搜索,但我不知道如何对多个 table 执行搜索立刻。这是一个搜索多个 tables WITHOUT textacular:

的示例查询
@results = Owner.includes(:car => :company).where("name LIKE ? OR cars.name LIKE ? OR companies.name LIKE ?", sql_query, sql_query, sql_query).references(:cars, :companies)

如您所见,此查询搜索 OwnerCarCompany table。我用 textacular 得到的最远的是:

@results = Owner.includes(:car => :company).references(:cars, :companies).fuzzy_search({name: sql_query})

上面的查询只搜索 Owner table。我尝试执行以下操作以使其也搜索 Companies table:

@results = Owner.includes(:car => :company).references(:cars, :companies).fuzzy_search({name: sql_query, "companies.name" => sql_query})

这不起作用,因为它会尝试搜索 owners.companies.name 字段,该字段当然不存在。除了 owners.name 字段之外,我还希望它搜索 companies.name 字段。有谁知道如何使用 textacular 对多个 table 执行模糊搜索?

不确定您是否热衷于 textacular,但从他们的文档来看,您似乎只能按一种模型进行搜索。

我以前用过 PgSearch,它非常强大,您可以跨模型搜索。

我想通了!您需要将加入的 table 名称添加为嵌套哈希。假设我想通过 Owner 模型和 Car 模型的 name 字段进行搜索:

@results = Owner.includes(:car).references(:cars).fuzzy_search({name: sql_query, cars: { name: sql_query}})

fuzzy_search 方法中指定的 cars table 指的是 table 的名称,而不是协会的名称。

我从 2008 年的这个旧 Rails commit 中得到灵感,这让我意识到可以在任何标准 Rails 查询中使用的条件在 fuzzy_search 方法中可用。