Busque varias palabras en varios modelos

Estoy tratando de crear la funcionalidad de búsqueda en un sitio, y quiero que el usuario pueda buscar varias palabras, realizando una coincidencia de subcadenas con los criterios que existen en varios modelos.

Por el bien de este ejemplo, digamos que tengo los siguientes modelos:

EmpleadEmpresMunicipiCondad

Un condado tiene varios municipios, que tiene varias empresas, que tienen varios empleados.

Quiero que la búsqueda pueda buscar en una combinación de Employee.firstname, Employee.lastname, Company.name, Municipality.name y County.name, y quiero que el resultado final sean instancias de Employee.

Por ejemplo, una búsqueda de la cadena "joe tulsa" debería devolver a todos los Empleados donde ambas palabras se pueden encontrar en algún lugar de las propiedades que mencioné en la oración anterior. Obtendré algunos falsos positivos, pero al menos debería conseguir que cada empleado llamado "Joe" en el condado de Tulsa.

He intentado un par de enfoques, pero no estoy seguro de seguir el camino correcto. Estoy buscando una buena manera de hacer esto, y espero que alguien con más sabiduría en RoR pueda ayudar a esbozar una solución adecuada.

Lo que he intentado:

No tengo mucha experiencia con este tipo de búsqueda, pero fuera de RoR, crearía manualmente una instrucción SQL para unir todas las tablas, crear cláusulas where para cada palabra de búsqueda separada, cubriendo las diferentes tablas. Quizás use un constructor. Luego, simplemente ejecute la consulta y recorra los resultados, cree instancias de los objetos Employee manualmente y agréguelos a una matriz.

Para resolver esto en RoR, he estado:

1) Apuntando con ámbitos con nombre en lo que en mi proyecto corresponde al modelo de Empleado, pero me quedé atrapado cuando necesitaba unirme a las tablas a dos o más "pasos" de distancia (Municipio y Condado).

2) Creó una vista (llamada "search_view") uniendo todas las tablas para simplificar la consulta. Luego pensé que usaría Employee.find_by_sql () en esta tabla, lo que me daría estos bonitos objetos Employee. Pensé que usaría un generador para crear el SQL, y parecía que Arel era lo que debía usar, así que intenté hacer algo como:

view = Arel::Table.new(:search_view)

Pero el Ariel :: Table resultante no contiene ninguna columna, por lo que no se puede utilizar para generar mi consulta. En este punto, estoy un poco atascado ya que no sé cómo obtener un generador de consultas que funcione.

Respuestas a la pregunta(1)

Su respuesta a la pregunta