Поиск без учета регистра в Rails

Лучший способ, который я нашел для поиска вещей, в которых я специально не хочу, чтобы регистр символов имел значение, - это:

@tag = Rails.env.development? ? Category.where("LOWER(name) LIKE ?", "%#{params[:find]}%")[0] : Category.where("LOWER(name) ILIKE ?", "%#{params[:find]}%")[0]

Мне нужен .env Finder, потому что я использую Heroku, и мне не нужно было устанавливать PostgreSQL на свои машины разработки. Тем не менее, нет чего-то вроде:

@tag = Category.find_by_name(params[:find], case_sensitive: false)

Есть ли параметры, которые мы можем передать помощнику find_by в Rails? Это было бы неплохо.


person Dudo    schedule 10.10.2013    source источник
comment
Итак, следующий человек, который увидит это и подумает: «К черту этого парня, голос против», пожалуйста, дайте мне знать, почему вы так думаете. Спасибо.   -  person Dudo    schedule 10.10.2013
comment
Я не голосовал против, но люди, вероятно, голосуют против, потому что вы сделали ехидное замечание в начале, которое не имеет смысла в вашем вопросе ...   -  person Tyler    schedule 11.10.2013
comment
И которую я удалил, потому что это не было продолжением.   -  person the Tin Man    schedule 11.10.2013
comment
Верно подмечено. Но я ошибаюсь? case_sensitive:, order:, unique:? Почему бы не передать несколько вариантов, чтобы получить больше от помощника find_by?   -  person Dudo    schedule 11.10.2013
comment
ну, мы можем сделать .uniq после этого, так что это спорный вопрос, но я уверен, что люди могли бы придумать несколько хороших   -  person Dudo    schedule 11.10.2013


Ответы (2)


Да, Rails поддерживает запросы без учета регистра через встроенный Библиотека Arel или драгоценный камень, такой как Squeel.

person Dogweather    schedule 06.12.2013
comment
Включен ли арел в рельсы? - person Dudo; 06.12.2013
comment
Должен ли я включать его в application.rb или в верхнюю часть моего контроллера? Нравится include 'open-uri'? - person Dudo; 07.12.2013
comment
Нет, ничего подобного не требуется. Просто начни им пользоваться. Arel уже используется в Rails. - person Dogweather; 07.12.2013

Есть ли параметры, которые мы можем передать помощнику find_by в Rails? Это было бы неплохо ...

Нет. (см. API)
Да, это было бы неплохо.

Вы, вероятно, не примете этот ответ, потому что ваш вопрос на самом деле не был вопросом
Возможно, поэтому вы получили отрицательное голосование.

Возможно, вы могли бы также строчные буквы params[:find] (params[:find].downcase) и позаботиться о настройке PG на ваших машинах разработчика.

Category.where("LOWER(name) LIKE ?", "%#{params[:find].downcase}%").first

А пока вы можете извлечь запрос в своей модели:

category.rb

def self.search_by_name(name)
  if Rails.env.development?
    where("LOWER(name) LIKE ?", "%#{name.downcase}%").take
  else
    where("LOWER(name) ILIKE ?", "%#{name}%").take
  end       
end

контроллер

@tag = Category.search_by_name(params[:find])
person Damien    schedule 10.10.2013
comment
Ну возник вопрос. Вы ответили на это ... нет, хеша опций нет. Вы можете сделать .downcase, если информация в базе данных тоже в нижнем регистре. Я нормально отношусь к нижнему регистру, как и к пользовательским электронным письмам при сохранении в БД, но аббревиатуры и инициалы определенно оставлены в верхнем регистре. Что касается тегов, я подумал, что это важно оставить в покое. PG - это не проблема, я просто объяснял, почему у меня там Rails.env.development?. - person Dudo; 11.10.2013
comment
Итак, хеш опций для find_by. Есть идеи, как это реализовать? Я проверил исходный файл в activerecord-3.2.13/lib/active_record/dynamic_finder_match.rb и могу проверить, нет никаких вариантов. Он использует RegEx для интерпретации того, что вы ищете, но я не вижу фактических функций поиска ... - person Dudo; 11.10.2013
comment
Я имел в виду ввести в нижний регистр как поисковый запрос , так и значения db: Category.where("LOWER(name) ILIKE ?", "%#{params[:find].downcase}%")[0]. Я подумал, Может, тебе тоже стоит ... но написал Может быть, ты тоже ... чтобы это звучало больше как предложение. - person Damien; 11.10.2013
comment
Кроме того, я не буду предлагать вам реализовывать это самостоятельно, потому что в конечном итоге обезьяны исправят рельсы. Просто извлеките запрос в своей модели и откройте вопрос на Github, чтобы узнать, готовы ли люди официально реализовать это в Rails. - person Damien; 11.10.2013
comment
Наконец, поддержка динамических поисковиков будет прекращена. Вам следует использовать больше find_by_name(name), но find_by(name: name). Это, конечно, если вы используете Rails 4. - person Damien; 11.10.2013
comment
Упс, извините, я имел в виду убрать поисковый запрос для LIKE запроса, а не для ILIKE - person Damien; 11.10.2013
comment
да, я где-то читал, что find_by помощники «немного устарели». Я не понимаю, почему ... бла. Спасибо за понимание, delba! - person Dudo; 11.10.2013
comment
Он устарел, потому что он использует методы метапрограммирования (метод missigng), который требует прохождения всего пути вверх по цепочке методов. Это медленно. - person Damien; 11.10.2013
comment
Я не согласен с тем, что вам нужно проделать эту работу. Используйте Arel или Squeel. Arel встроен в Rails. - person Dogweather; 07.12.2013