Eu quero fazer algo como:
SELECT * FROM USER WHERE NAME LIKE '%Smith%';
Minha tentativa em Arel:
# params[:query] = 'Smith'
User.where("name like '%?%'", params[:query]).to_sql
No entanto, isso se torna:
SELECT * FROM USER WHERE NAME LIKE '%'Smith'%';
Arel envolve a string de consulta 'Smith' corretamente, mas como esta é uma instrução LIKE, ela não funciona.
Como alguém faz uma consulta LIKE no Arel?
Bônus PS - Na verdade, estou tentando verificar dois campos da tabela, nome e descrição, para ver se há alguma correspondência com a consulta. Como isso funcionaria?
ruby-on-rails
activerecord
arel
filsa
fonte
fonte
Respostas:
É assim que você executa uma consulta semelhante no arel:
PS:
fonte
where("name like ?", ...)
, essa abordagem é mais portátil em bancos de dados diferentes. Por exemplo, isso resultaria emILIKE
ser usado em uma consulta em um banco de dados Postgres.User.where(users[:name].matches("%#{params[:user_name]}%"))
tenteiTRUNCATE users;
e outras consultas semelhantes e nada aconteceu no lado do sql. Parece seguro para mim..gsub(/[%_]/, '\\\\\0')
para escapar de caracteres curinga do MySql.Experimentar
PS.
Aaand já faz muito tempo, mas @ cgg5207 adicionou uma modificação (principalmente útil se você for pesquisar parâmetros de nomes longos ou múltiplos ou se você estiver com preguiça de digitar)
ou
fonte
%
na string substituída? Parece que se você só quisesse um caractere curinga unilateral, não há nada que impeça o usuário de enviar um valor de consulta que inclua%
em ambas as extremidades (eu sei que na prática, Rails impede%
de aparecer em uma string de consulta, mas parece que existe deve haver proteção contra isso no nível ActiveRecord).to_sql
ou gerenciador arel, como executar o sql no banco de dados?A resposta de Reuben Mallaby pode ser encurtada ainda mais para usar ligações de parâmetro:
fonte