Помогите с рельсами активной записи запросов (как пункт) - PullRequest
5 голосов
/ 26 октября 2010

Я хочу, чтобы мой код делал две вещи, которые в данный момент не выполняются

@students = Student.where(["first_name = ? OR middle_name = ? OR last_name = ?", params[:query].split])
  1. Работа. (говорится, что я должен передать 4 параметра, но я хочу, чтобы пользователь мог набирать слова и находить по этим словам в каждом из этих полей и возвращать все совпадения)

  2. На самом деле использовать предложение Like вместо жесткого предложения равенства.

Пожалуйста, помогите.

Ответы [ 3 ]

8 голосов
/ 26 октября 2010

Это похоже на проблему, которая лучше подходит для поиска, чем для SQL. Рассматривали ли вы что-то вроде думающего сфинкса или , выступающего в роли хорька (solr, вероятно, было бы излишним).

... если вы должны сделать это в sql, вы можете построить запрос примерно так:

cols = ['first_name', 'last_name', 'middle_name']
query = 'John Smith'
sql_query = cols.map{|c| query.split.map{|q| "#{c} like '?'"}}.join(' OR ')
sql_query_array = query.split * cols.count
Student.where(sql_query, sql_query_array)
4 голосов
/ 28 октября 2010

Я согласен с предыдущим советом, что если вам нужно заняться поиском, вы должны посмотреть на что-то вроде Solr или Sphinx.

В любом случае, это должно вам помочь.ответом на шаг 1 является использование удивительной маленькой функции Ruby, называемой «оператором сплат», которая позволяет вам взять массив и оценить его как список аргументов.

Ответ на шаг 2 - просто массаж строки запросаВы возвращаетесь из параметров и превращаете их в то, что вы можете использовать с оператором LIKE.Я в основном украл это из эпизода простой формы поиска Railscasts .

1 голос
/ 13 мая 2014

Я не уверен, если вы хотите, чтобы все поля выполняли поиск по одному и тому же термину, если это - регистр, то вы можете сделать это:

where("first_name LIKE :term OR middle_name LIKE :term OR last_name LIKE :term", { term: "%#{params[:term]}%"})

Не нужно никаких сумасшедших split или map или чего-либо еще, это просто ActiveRecord

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...