2016-03-10 72 views
0

我目前正在學習如何使用Ruby on Rails與The Odin Project,現在我正在處理製作表單。我試圖從我的數據庫中提取獨特的日期以填充項目的下拉選項框。我在我看來使用form_for,我使用select函數,它接受一個數組數組,即[[「option one」,1],[「option two」,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 

無濟於事。我嘗試了一個快速的谷歌搜索

SELECT start FROM flights GROUP BY start 

但我仍然得到重複。我不是最好的SQL,所以任何幫助,將不勝感激。

編輯:

我DATATIME柱確實有一個時間組件,因此這可能是問題

從DB模式這裏是我的航班表,如果它的任何幫助

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中,它只是說日期時間,但它包含一個時間組件。這可能是問題所在,我會嘗試格式化以獲得時間部分,但我不知道如何去做。我會檢查谷歌! – SkipCloud

回答

0

經過一些更多的在線搜索,我發現了一個更簡單的方法來獲得我想要的結果。使用:pluck方法作爲捷徑來拉取數據庫中我想要的屬性,在日期時間上調用:to_date以刪除時間組件,然後調用:uniq以獲得像我所需的唯一日期。

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

如果選擇不同日期仍然是重複的,它很可能是日期格式有時間,日期有不同的時間。

您應該將列開頭日期CAST(start AS DATE)轉換爲日期列,然後才能使用group by。

+1

這裏不需要任何'GROUP BY','SELECT DISTINCT'就可以。 – jarlh

+0

是@jarlh!我完全忘了那個細節。 – Edu

+0

我試着使用'SELECT CAST(start AS DATE)FROM FROM GROUP BY start',但它只是返回了很多具有'nil'的ID屬性的Flight對象,但沒有啓動/日期時間屬性。 @jarlh如果我使用不同它只返回一個飛行物體。 – SkipCloud

相關問題