Eu estou tentando fazer uma consulta como assim
def self.search(search, page = 1 )
paginate :per_page => 5, :page => page,
:conditions => ["name LIKE '%?%' OR postal_code like '%?%'", search, search], order => 'name'
end
Mas quando é executado, algo está adicionando aspas, o que faz com que a instrução sql saia dessa maneira
SELECT COUNT(*)
FROM "schools"
WHERE (name LIKE '%'havard'%' OR postal_code like '%'havard'%')):
Então você pode ver o meu problema. Estou usando o Rails 4 e o Postgres 9, os quais nunca usei, portanto, não tenho certeza se isso é algo de um registro ativo ou possivelmente algo do postgres.
Como posso configurar isso para que eu tenha como '%my_search%'
na consulta final?
sql
ruby-on-rails
ruby
postgresql
activerecord
Harry Forbess
fonte
fonte
search
cordas são higienizadas??
no qual vai cuidar de saneantes%
e_
insidesearch
não serão higienizadas, sob essa abordagem.Em vez de usar a
conditions
sintaxe do Rails 2, use owhere
método do Rails 4 :NOTA: o acima usa sintaxe de parâmetro em vez de? espaço reservado: esses dois devem gerar o mesmo sql.
NOTA: usando
ILIKE
para o nome - versão sem diferenciação de maiúsculas e minúsculas do LIKEfonte
Movie.where("title ILIKE :s", s: search_string)
isso é traduzido paraSELECT 1 AS one FROM "movies" WHERE (title ILIKE 'test') LIMIT $1
pelo ActiveRecord (Rails 5.1.6) - aviso por favor que não há nenhum símbolo de porcentagem após a ILIKE)search_string
variável. Eu acho que aSELECT 1 AS one
saída está apenas no console de trilhos ou você está usandolimit(1)
? FYI: Rails 5.1.6 tem problemas de segurança, use 5.1.6.2 ou 5.1.7 vezEmbora a interpolação de strings funcione, como sua pergunta especifica os trilhos 4, você pode usar o Arel para isso e manter o banco de dados de aplicativos independente.
fonte
O ActiveRecord é inteligente o suficiente para saber que o parâmetro referido por
?
é uma string e, portanto, o coloca entre aspas simples. Como um post sugere, você pode usar a interpolação de string Ruby para preencher a string com os%
símbolos necessários . No entanto, isso pode expô-lo à injeção de SQL (que é ruim). Eu sugiro que você use aCONCAT()
função SQL para preparar a string da seguinte maneira:"name LIKE CONCAT('%',?,'%') OR postal_code LIKE CONCAT('%',?,'%')", search, search)
fonte
%
é anexado / anexado ou não). Funciona como esperado ou os trilhos têm um erro grave que afeta os dois casos.Experimentar
Consulte os documentos sobre condições AREL para obter mais informações.
fonte
fonte