рефакторинг сложного динамического запроса активного отношения - PullRequest
0 голосов
/ 13 мая 2011

Мне было интересно, смогу ли я получить справку по рефакторингу, чтобы сделать этот запрос более кратким.

По сути, этот запрос выполняет поиск во всех справочных документах по некоторым поисковым запросам.Он проверяет вопрос документа, его содержание и категорию, к которой он относится.

  def self.search(text)
    if text.blank?
      latest
    else
      relation = sorted.joins(:category)

      text.split(/\s/).each do |word|
        relation = relation.where(
            "lower(help_documents.question) like ? or lower(help_documents.content) like ? or lower(help_categories.name) like ?",
            "%#{word.downcase}%", "%#{word.downcase}%", "%#{word.downcase}%"
        )
      end

      relation
    end
  end

По сравнению с тем, как вы делаете это в java / hibernate, на самом деле это выглядит довольно хорошо.Но я подумал, что у людей могут быть еще более сексуальные уловки, чтобы выполнить то же самое.Например, могут быть некоторые методы / объекты, о которых я не знаю, которые уже делают подобные вещи.

1 Ответ

2 голосов
/ 13 мая 2011

Я бы сначала убрал это, удалив все строчные и строчные буквы. Если вы используете mysql и ваша таблица - utf8, то подобное будет без учета регистра. Это должно убрать шум, чтобы мы могли больше взглянуть на проблему.

Также вы можете использовать именованные ключи в следующих местах:

relation.where("help_documents.question like :term, or help_documents.content like :term, or help_categories.name like :term", {:term => "%#{word}%"})

Кроме того, вы можете проверить squeel (http://metautonomo.us/projects/squeel/), который позволяет вам пойти дальше и дает много синтаксического сахара.

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