Rails: как найти поле, содержащее определенную строку - PullRequest
56 голосов
/ 14 марта 2012

У меня есть модель с именем Тема, которая имеет имя в качестве поля.

Скажем, у меня есть термин, который я ищу, яблоко.

Если я сделаю

Topic.find_by_name("apple")

Я получаю запись с названием apple. Это хорошо - но как мне изменить find_by_name, чтобы он мог находить как «яблочный сок», так и «яблоко» - в основном, находить имена, которые содержат исходный запрос или точно соответствуют исходному запросу?

Edit: Спасибо за все ответы. Я думаю, мне следовало быть немного более ясным раньше, но что, если я хочу найти по имени переменной (очевидно, я не собираюсь искать по имени «яблоко» каждый раз :))?

Как мне манипулировать Topic.where, чтобы приспособиться к этому? Так что-то вроде ...

@topic = Topic.where(......., @name)

Ответы [ 5 ]

111 голосов
/ 14 марта 2012

Я думаю, что-то вроде этого должно работать:

Topic.where("name like ?", "%apple%")

Для размещения для редактирования:

Topic.where("name like ?", "%#{@search}%")

Базовая интерполяция строк, вы используете значение @search внутри строки %%, так что вы @search = "apple", и в итоге вы получаете %apple%

10 голосов
/ 14 марта 2012

Похоже, что в Rails 3 вы хотели бы использовать где:

Topic.where("name ILIKE ?", "%apple%")
8 голосов
/ 14 апреля 2017

В PostgreSQL вы также можете использовать операторы сопоставления :

Topic.where("name ~* ?", @search)
8 голосов
/ 14 марта 2012

Не ставьте строку прямо так. Это называется SQL-инъекцией. Вместо этого вы должны использовать .where:

Topic.where("name like '?%' ", params[:name])
1 голос
/ 14 марта 2012

Попробуйте

Topic.where("name like ?",'%apple%')
Topic.find(:all, :conditions => ["name like ?","%apple%"])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...