Перепишите SQL-запрос для работы на героку - PullRequest
2 голосов
/ 28 июня 2010

Как мне переписать этот запрос рельсов для запуска на Heroku (Portegres)

@students = Student.find(:all, 
                  :conditions =>["(concat(first_name, ' ', last_name) LIKE ?) OR
                                  (concat(first_name, ' ', middle_names, ' ', last_name) LIKE ?)",
                                 "%#{params[:search]}%", "%#{params[:search]}%"]
                        )

Ответы [ 4 ]

5 голосов
/ 28 июня 2010

столкнулся с этой проблемой тоже.Postgres учитывает регистр с оператором LIKE, поэтому вот что я сделал в проекте.Кроме того, я не люблю запускать postgres локально, поэтому у меня он работает с LIKE в разработке (mysql / sqlite) и ILIKE в производстве (postgres).ILIKE "нечувствителен к регистру как"

/ config / environment.rb

  DATABASE_OPERATOR = {
    :like_operator => "LIKE"
  }

/ config / environment / production.rb

  DATABASE_OPERATOR = {
    :like_operator => 'ILIKE' #postgres awfulness
  }

Запрос

@students = Student.find(:all, :conditions => ['(concat(first_name, " ", last_name) #{DATABASE_OPERATOR[:like_operator]} ?) OR (concat(first_name, " ", middle_names, " ", last_name) #{DATABASE_OPERATOR[:like_operator]} ?)', "%#{params[:search]}%", "%#{params[:search]}%"])
1 голос
/ 28 июня 2010

Использовать трубы || вместо CONCAT это стандартный SQL:

@students = Student.find(:all, :conditions => ['(first_name || last_name LIKE ?) OR (first_name || middle_names || last_name LIKE ?)', "%#{params[:search]}%", "%#{params[:search]}%"])

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

0 голосов
/ 28 июня 2010

Нет смысла использовать concat(). @ Ответ Фрэнка близок, но логика нарушена.

where (first_name || last_name LIKE ?) оценивается как

"где first_name оценивается как true или , где last_name содержит поисковый термин"

Это должно дать вам ожидаемый результат

Student.all(
  :conditions => ["
    first_name like :search ||
    last_name like :search  ||
    middle_names like :search
    ",
    {:search => "%#{params[:search]}%"}
  ]
)

Это будет соответствовать всем строкам таблицы students, в каждой из которых указано params[:search].

0 голосов
/ 28 июня 2010

Использовать следующие

Student.find(:all, 
                  :conditions =>["(concat(first_name, ' ', last_name) LIKE :text) OR
                                  (concat(first_name, ' ', middle_names, ' ', last_name) LIKE :text)",
                                 {:text=>"%#{params[:search]}%"]
                        )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...