2015-09-02 3 views
-1

Я знаю, как найти записи в диапазоне дат, и видел ответы на подобные вопросы. Мой вопрос заключается в том, как переформатировать значение даты с «мм/дд/гг» до формата, который можно сравнить с диапазоном дат, все в одном запросе.Ruby on Rails - выбор записей в диапазоне дат (низкая производительность)

У меня есть столбец в моей базе данных, который содержит дату в формате «мм/дд/гг». Я пытаюсь написать запрос, который будет выбирать все записи в диапазоне дат, определяемом start_date и end_date переменными, которые являются объектами Ruby Date.

Это лучшее, что я до сих пор, но это очень медленно:

date_records = Record.select { |r| ((r.division == division) && (Date.strptime(r.date, "%m/%d/%y") >= start_date) && (Date.strptime(r.date, "%m/%d/%y") <= end_date)) } 
+1

возможно дубликат http://stackoverflow.com/questions/2381718/rails-activerecord-date-between есть ли конкретная причина, почему вы с помощью оператора SQL непосредственно, вместо запроса ActiveRecord он lpers? –

+0

Нет причин ... Я отлично использую '.where'. Моя основная борьба - это получение даты из формата «мм/дд/гг» для сравнения в запросе. Это лучшее, что я мог сделать, и это очень медленно: 'date_records = Record.select {| r | ((Date.strptime (r.date, "% m /% d /% y")> = start_date) && (Date.strptime (r.date, "% m /% d /% y") <= end_date))} ' – PyroLemur

+0

Кажется, что первое задание должно состоять в том, чтобы хранить эти даты как даты, а не как строки. –

ответ

-1

Я обнаружил, что преобразование моих записей в формат JSON, прежде чем делать .select, который анализирует и сравнивает дату повышения производительности значительно (~ 35s вниз до ~ 4s):

division_records = Record.where(division: division).as_json date_range_records = division_records.select { |r| ((start_date..end_date).include? Date.strptime(r["date"], "%m/%d/%y")) }

Смежные вопросы