2016-03-10 70 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

相关问题