2016-05-22 33 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]型の配列の配列。の2番目の要素のために使用することはできません。idは常に異なっています。

私が試しているコード配列の最後/最初の要素にアクセスし、その[0]要素を取得します。これは "22/5/2016"となり、現在の日付と等しい場合はこの繰り返しをスキップします。私が期待しているとおりに動作していません。

少なくとも7つのフライトと3つの異なる日付があるので、少なくとも1つの異なるキャッチが難しくありません。

重複レコードはどのようにフィルタできますか?

答えて

2

一意日付でデータベースから直接フライトを照会し、すでにソートするには、ActiveRecordのは、これを行うに使用することができます。この中

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

を、DISTINCTgroupflight_dateによって便を一意にするために使用されています。 orderを使用して結果をソートします。逆順でソートする場合は、order("flight_date DESC")を使用してください。 whereは、今日までのフライトの日付を取得したフライトのみを取得するように指示しています。同様のクエリにも合わせて変更することができます。

すでにデータベースから重複を取得している場合は、Ruby標準ライブラリArray#uniqueをブロックとしてメモリ内でソートできます。これを試してください:

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

これは、最初の要素によって一意の配列を返します。

フィルタコードを修正するには、ブロックからdates値を返すだけです。これはmapブロックから正しい値を返す必要があります:レコードをフィルタリングする

@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

は、非常にエレガントな答えをありがとう。私はコントローラ上でヘルパーメソッドを使用して終了しました。あなたの方法は、私が正しく理解すれば、それの上に私の日付のコードを実行し、固有の日付でフライトを得るだろう。 –

+0

@nathaks私は答えを更新し、既にソートされたデータベースからレコードを取り出すことを含むようにしました。これは実際にメモリ上でこれ​​を行うよりも優れています。あなたのコメントの質問に関しては、これらを一緒に使うことができます。彼らはまた、独立して使用することができます。アプリケーションでどのように動作する必要があるかによって異なります。データベースソリューションは、一度にすべてのソートとフィルタリングを行う必要があります。私は説明を少しはっきりさせるように更新しました。 –

関連する問題