Nosso aplicativo semelhante a uma loja tem um Order
e Client
classes:
class Order < ActiveRecord::Base
belongs_to :user
end
class Client < ActiveRecord::Base
has_many :orders
end
E a Client
obviamente tem um name
e um surname
entre 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?