2016-05-22 88 views
1

我正在Rails中执行航班预订应用程序,并已成功列出航班作为数组的日期。如何删除阵列中的重复项Ruby

但是,我有重复的问题。我用了一个select_tag(:日期,options_for_select(@dates),它的工作原理,但我已经得到了所有这些重复的日期

继承人的代码@dates

@dates=Flight.all.map do |a| 
    dates=[] 
    unless dates.any? && dates.last[0]==a.flight_date_formatted 
    dates<<[a.flight_date_formatted, a.id] 
    end 
end 

这将返回。 [“22/5/2016”,1]类型的数组阵列我不能使用unique因为第二个元素,其中id总是不同的。访问数组的最后一个/第一个元素并获取[0]元素,这将是“22/5/2016”,如果它等于当前日期,则跳过此迭代。不幸的是,没有按照我的预期工作。

有7个航班,只有3个不同的日期,所以它不难捕捉至少一个不同的日期。

如何筛选重复记录?

回答

2

要直接从数据库中唯一按日期查询航班和已经排序,你可以使用ActiveRecord做到这一点:

today = DateTime.now.to_date 
@flights = Flight.select("DISTINCT flight_date, *").where("flight_date < ?", today).group(:flight_date).order("flight_date") 

在这方面,DISTINCTgroup被用来制造由flight_date独特的航班。 order用于排序结果;如果您希望它们按相反顺序排序,请使用order("flight_date DESC")where说只检索今天之前有航班日期的航班。任何这些都可以改变,以适应类似的查询。

如果已经从数据库中检索到重复项,则可以使用一个块将它们与Ruby标准库Array#unique在内存中排序。试试这个:

@flights = Flight.all.unique {|a,b| a[0] <=> b[0] } 

这将返回一个由第一个元素唯一的数组。

要更正您的过滤器代码,您只需要返回块中的dates值。

@dates=Flight.all.map do |a| 
    dates=[] 
    unless dates.any? && dates.last[0]==a.flight_date_formatted 
    dates<<[a.flight_date_formatted, a.id] 
    end 
    dates 
end 

“短”的方式来过滤掉的记录是Array#select,您可以使用这样的:

today = DateTime.now.strftime("%-d/%-m/%Y") 
@flights = @flights.select {|flight| flight[0] != today } 
+0

谢谢,非常优雅回答这个问题应该从map块返回正确的值。我最终在控制器上使用了一个辅助方法。如果我理解正确,你的方法是获得具有独特日期的航班,然后在其上运行我的日期代码。 –

+0

@nathaks我更新了我的答案,包括从数据库中检索已经排序和唯一的记录。这实际上比在记忆中这样做更好。关于你的评论问题,这些可以一起使用。它们也可以独立使用。这取决于你如何在你的应用程序中使用它。数据库解决方案应该一次筛选和筛选。我更新了描述,使其更清晰一些。 –