2016-03-10 2 views
0

В настоящее время я изучаю, как использовать Ruby on Rails с The Odin Project, и сейчас я занимаюсь созданием форм. Я пытаюсь вытащить уникальные даты из моей базы данных, чтобы заполнить окно раскрывающихся списков для проекта. Я использую form_for в моем представлении, и я использую функцию select, которая принимает массив массивов, т.е. [[«вариант один», 1], [«вариант два», 2]] и т. Д. Идея заключается в том, что только уникальные даты которые находятся в базе данных, должны отображаться в параметрах. Моя проблема заключается в том, что повторяющиеся даты продолжают отображаться, например.Выбор отдельных дат

03/03/2016 
03/03/2016 
04/03/2016 
05/03/2016 
06/03/2016 
06/03/2016 

Использование find_by_sql Я попытался

SELECT DISTINCT start FROM flights 

безрезультатно. После быстрого поиска Google я попробовал

SELECT start FROM flights GROUP BY start 

но я все еще получаю дубликаты. Я не лучший с SQL, поэтому любая помощь будет оценена по достоинству.

редактировать:

Моя колонка datatime имеет временную составляющую, так что, вероятно, вопрос

Из схемы БД вот моя таблица полетов, если это любая помощь

create_table "flights", force: :cascade do |t| 
    t.integer "from_airport_id" 
    t.integer "to_airport_id" 
    t.datetime "start" 
    t.integer "flight_duration" 
    t.datetime "created_at",  null: false 
    t.datetime "updated_at",  null: false 
end 
+1

(1) Что такое тип данных 'start'? (2) Какую базу данных вы используете? Наиболее вероятная проблема заключается в том, что 'start' имеет компонент времени, и вам нужно просто извлечь дату (или отформатировать результат, чтобы вы увидели компонент времени). –

+1

Вы имеете в виду, что 'SELECT DISTINCT' возвращает повторяющиеся строки? Очень странно. Разве что весь выбор?!? – jarlh

+1

@gordonlinoff В Rails он просто говорит datetime, но он включает компонент времени. Вероятно, это проблема, я попробую форматировать, чтобы получить часть времени, хотя я не уверен, как это сделать. Я проверю google! – SkipCloud

ответ

0

После некоторого поиска в Интернете я нашел намного более простой способ получить результат, который я хотел. Используя метод :pluck в качестве короткого разреза, вытащите только те атрибуты, которые мне нужны из базы данных, вызвав :to_date в datetime, чтобы удалить компонент времени, а затем позвонив :uniq, чтобы получить уникальные даты, как мне было нужно.

Flight.pluck(:start).map {|a| [a.strftime("%d/%m/%Y"), a.to_date]}.uniq 
0

При выборе отчетливый даты все еще получают дубликаты, скорее всего, формат даты имеет время, а даты имеют разные времена.

Вы должны указать начало столбца CAST(start AS DATE), чтобы преобразовать столбец в дату и только затем использовать группу.

+1

Нет необходимости в каких-либо 'GROUP BY' здесь,' SELECT DISTINCT' будет отлично. – jarlh

+0

Да @jarlh! Я полностью забыл эту деталь. – Edu

+0

Я попытался использовать 'SELECT CAST (начало AS DATE) FROM flight GROUP BY start', но он просто вернул много объектов полета с' nil' для атрибута ID, но не атрибут start/datetime. @jarlh Если я использую разницу, он просто возвращает один объект полета. – SkipCloud

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