Я пытаюсь сделать такой запрос
def self.search(search, page = 1 )
paginate :per_page => 5, :page => page,
:conditions => ["name LIKE '%?%' OR postal_code like '%?%'", search, search], order => 'name'
end
Но когда он запускается, что-то добавляет кавычки, что приводит к тому, что оператор sql выглядит так
SELECT COUNT(*)
FROM "schools"
WHERE (name LIKE '%'havard'%' OR postal_code like '%'havard'%')):
Итак, вы видите мою проблему. Я использую Rails 4 и Postgres 9, оба из которых я никогда не использовал, поэтому не уверен, что это и функция activerecord, или, возможно, вещь postgres.
Как я могу настроить это так, чтобы '%my_search%'
в конечном запросе было лайк ?
sql
ruby-on-rails
ruby
postgresql
activerecord
Гарри Форбесс
источник
источник
search
продезинфицированы ли эти строки??
в где позаботятся о дезинфекции%
и_
внутриsearch
не будут обрабатываться при таком подходе.Вместо использования
conditions
синтаксиса из Rails 2 используйтеwhere
вместо этого метод Rails 4 :ПРИМЕЧАНИЕ: выше используется синтаксис параметра вместо? заполнитель: они оба должны генерировать один и тот же sql.
ПРИМЕЧАНИЕ: использование
ILIKE
для имени - postgres нечувствительная к регистру версия LIKEисточник
Movie.where("title ILIKE :s", s: search_string)
он переводится вSELECT 1 AS one FROM "movies" WHERE (title ILIKE 'test') LIMIT $1
ActiveRecord (Rails 5.1.6) - обратите внимание, что после ILIKE нет символа процента)search_string
переменной. Я думаю, чтоSELECT 1 AS one
вывод находится только в консоли rails или вы используетеlimit(1)
? К вашему сведению: Rails 5.1.6 имеет проблемы с безопасностью, используйте вместо него 5.1.6.2 или 5.1.7Хотя интерполяция строк будет работать, поскольку в вашем вопросе указаны рельсы 4, вы можете использовать для этого Arel и сохранить независимость базы данных вашего приложения.
источник
ActiveRecord достаточно умен, чтобы знать, что параметр, на который ссылается,
?
является строкой, и поэтому он заключает его в одинарные кавычки. Как предлагается в одном сообщении, вы можете использовать интерполяцию строк Ruby для заполнения строки необходимыми%
символами. Однако это может привести к SQL-инъекции (что плохо). Я бы посоветовал вам использоватьCONCAT()
функцию SQL для подготовки такой строки:"name LIKE CONCAT('%',?,'%') OR postal_code LIKE CONCAT('%',?,'%')", search, search)
источник
%
, добавлен / добавлен или нет). Либо он работает, как ожидалось, либо у rails есть серьезная ошибка, затрагивающая оба случая.Пытаться
Дополнительную информацию см. В документации по условиям AREL.
источник
источник