2016-01-25 2 views
0

Таблица concerts и столбец concerts.occurence_dates из Array Тип. Мне нужно выбрать концерты, которые встречаются в пределах from_date и to_date с использованием ActiveRecord.Выбрать записи в диапазоне дат в Postgres

Я просто понял, как выбрать события после from_date:

Concert.where(':from_date < ANY(occurrence_dates)', from_date: from_date) 

ответ

0

Возможное решение:

Concert.where('(occurrence_dates[0], occurrence_dates[array_length(occurrence_dates, 1)]) OVERLAPS (:from_date, :to_date)', from_date: from_date, to_date: to_date) 
0

Как mentioned in the official documentation

Массивы не являются множествами; поиск определенных элементов массива может быть признаком неправильной настройки базы данных. Рассмотрите возможность использования отдельной таблицы со строкой для каждого элемента, который будет элементом массива. Это будет легче искать и, скорее всего, лучше масштабируется для большого количества элементов.

Это также относится к вашему делу, пытаясь выполнить поиск с использованием определенных элементов массива.

Вы используете неправильное поле. Вам действительно нужно использовать два отдельных столбца, один для from_date, а другой для to_date, а также два индекса.

Индексы обеспечат быстрый поиск, отдельные столбцы позволят вам найти пропускание диапазона дат или просто с помощью

Concert.where('from_date >= ? AND to_date <= ?', from_date, to_date) 

С текущей настройкой, лучшее решением будет сканировать все записи, выберите каждый occurrence_dates и проверьте, соответствуют ли они вашим критериям.

+0

что, если я не владелец БД и иметь его в наследство? – yurko

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