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)
如您所见,此查询搜索 Owner
、Car
和 Company
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
方法中可用。
我正在使用 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)
如您所见,此查询搜索 Owner
、Car
和 Company
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
方法中可用。