#ruby-on-rails #ruby #ruby-on-rails-3
#ruby-on-rails #ruby #ruby-on-rails-3
Вопрос:
Я использовал эпизод поиска Райана Бейта с Ajax, чтобы написать некоторые базовые функции поиска.
Что он в основном делает, так это берет строку из формы и выполняет аналогичный запрос с помощью метода модели. То, что я пытаюсь сделать, это выполнить условный поиск по разным столбцам (due_date и name ) в базе данных с помощью одной строки, которую я анализирую с помощью класса Date . Таким образом, пользователь может искать элементы по дате или по имени элемента в той же форме. Мой метод выглядит так:
def self.search(search)
if search
search_date = Date.parse(search) rescue nil
end
if search_date
where('due_date = ?', search_date)
elsif search
where('UPPER(name) LIKE ?', "%#{search.upcase}%")
else
scoped
end
end
Это работает, как если бы пользователь вводил дату, класс Date может ее проанализировать и искать в базе данных любые объекты, у которых есть это значение due_date . Проблема в том, что если это дата и ее можно анализировать, поиск происходит невероятно медленно.
Мне было интересно, есть ли у кого-нибудь способ ускорить это. Это класс Date такой медленный? Должен ли я использовать два разных метода? или я должен полностью переписать свой поиск?
Ответ №1:
Я действительно сомневаюсь, что это Date.parse
медленно. Вы log/development.log
должны проверить, каково время выполнения запроса. То, что вы, скорее всего, испытываете, — это сканирование таблицы, потому что у вас отсутствует индекс due_date
.
Всегда проверяйте медленные запросы с помощью EXAMINE
. Пример:
EXAMINE SELECT * FROM items WHERE due_date='2011-01-01'
Вы получите некоторую информацию о количестве строк, которые ему нужно будет отсортировать, плюс любые индексы, которые могут быть использованы.
Ответ №2:
Хотя обработка даты в Ruby, как известно, медленная, это не будет заметно для одного такого вызова…
Вероятно, в вашей базе данных отсутствует индекс…
Проверьте, что вы определили в качестве индексов для вашей таблицы, о которой идет речь… Вы должны выполнять миграцию с этим в нем:
add_index :my_table, :due_date
Тогда ваша база данных сможет быстро находить записи.
Ответ №3:
В то время как предыдущие ответы о поиске медленных запросов и использовании индекса, вероятно, принесут вам больше пользы, вам также следует ознакомиться с реализацией Date / DateTime Райана Эвана на языке C, жемчужиной home_run .