2015-10-24 5 views
0

Я использую камень textacular для реализации нечеткого поиска в моем приложении Rails, и я не могу понять, как выполнить поиск по нескольким таблицам сразу. Вот пример запроса, который ищет нескольких таблиц без textacular:Rails - Как выполнить нечеткий поиск на нескольких таблицах с использованием 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 таблицы. Дальние я с textacular это:

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

выше запрос ищет только Owner таблицу, хотя. Я попытался сделать следующее, чтобы заставить его искать Companies таблицу, а также:

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

Это не работает, потому что он пытается искать в owners.companies.name поле, которое, конечно, не существует. Я хочу, чтобы он искал поле companies.name в дополнение к полю owners.name. Кто-нибудь знает, как выполнить нечеткий поиск по нескольким таблицам, используя textacular?

ответ

1

Я понял! Вам нужно добавить имя объединенной таблицы как вложенный хеш. Скажем, я хочу, чтобы искать по name полей Owner модели и Car модели:

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

cars таблице указано в методе fuzzy_search относится к имени таблицы, а не имя ассоциации.

Я получил вдохновение от этого старого Rails commit с 2008 года, что заставило меня понять, что условия, которые вы можете использовать в любом стандартном запросе Rails, доступны в методе fuzzy_search.

0

Не уверен, что вы привязаны к textacular, но из своих документов это похоже, что вы можете искать только по одной модели.

Я использовал PgSearch раньше, и это довольно прочный, вы можете искать по всем моделям.

+0

Благодарим вас за ответ! Я действительно набрал свой ответ, когда вы разместили это. Я понял, как это сделать. – Alexander