Pesquisa ActiveRecord em uma concatenação de campos usando uma consulta incompleta

Nosso aplicativo semelhante a uma loja tem um Ordere Clientclasses:

class Order < ActiveRecord::Base
belongs_to
:user
end

class Client < ActiveRecord::Base
has_many
:orders
end

E a Clientobviamente tem um namee um surnameentre outros campos:

Client(id: integer, name: string, surname: string, ...)

#Existing Order in our DB and corresponding Client
'Order#1 - John Smith'
'Order#2 - Anna Garcia'
'Order#3 - John Brown'
'Order#4 - Ann Richards'
'Order#5 - John Smith'
'Order#6 - John Smith'

Agora gostaríamos de recuperar os Pedidos adquiridos pelo cliente ‘John Smith’. Porém, nossa consulta deve funcionar em casos onde name e / ou surname estão incompletos.

Por exemplo: john, smith, john smith, jo smith, john sm.

Esta seria uma abordagem possível:

#app/controllers/searches_controller.rb
...
def search_orders
@orders=Order.joins(client).where("clients.name || ' ' || clients.surname ILIKE :search", search:"%#{query.split().join('% ')}%")
end

O uso query.split().join('% ')converte as consultas da seguinte forma:

  • john-> %john% (Corresponde aos pedidos de John Smith AND John Brown )
  • smith-> %smith%(Corresponde aos pedidos de John Smith )
  • john smith-> %john% smith%(Corresponde aos pedidos de John Smith )
  • jo smith-> %jo% smith%(Corresponde aos pedidos de John Smith )
  • jo sm-> %jo% sm%(Corresponde aos pedidos de John Smith )

– Editar

No caso gostaríamos de usar consultas reversa tais como smi john, smith john. Precisamos apenas adicionar um caso OR ao nosso SQL. Por exemplo

#app/controllers/searches_controller.rb
...
def search_orders
@orders=Order.joins(client).where("clients.name || ' ' || clients.surname ILIKE :search OR clients.surname || ' ' || clients.name ILIKE :search", search:"%#{query.split().join('% ')}%")
end

Alguma outra abordagem?