2017-01-30 14 views
1

はRailsのガイドによると、これはあなたが範囲に照会する方法を示します。Railsで日付範囲をクエリするにはどうすればよいですか?

http://edgeguides.rubyonrails.org/active_record_postgresql.html#range-types

## All Events on a given date 
Event.where("dates @> ?::date", Date.new(2014, 2, 12)) 

しかし、どのように私は日付範囲内のすべてのイベントを得るのですか?

は、私はこれを行うことができます知っている:

Event.where("dates && daterange(?, ?)", date1, date2) 

しかし、この日付範囲は境界として「[」)を使用してデフォルトになります。実際の範囲が自動的に考慮されるように、2つの日付の代わりに範囲を指定する方法はありますか?これらは異なっていること

お知らせ:

date1..date2 != date1...date2 

は、これまでのところ、私はこれをやっている:

if dates.exclude_end? 
    Event.where("dates && daterange(?, ?, '[)')", dates.begin, dates.end) 
else 
    Event.where("dates && daterange(?, ?, '[]')", dates.begin, dates.end) 
end 

しかし、より良い方法はありますか?

Event.where("dates && ?::daterange)", dates) 

はEDIT:私の場合は

datesは日付範囲である私は、このような何かを愛することになります。

[6] pry(main)> Reservation.where(dates:  Date.current..4.days.from_now.to_date).explain 

Reservation Load (0.8ms) SELECT "reservations".* FROM "reservations" WHERE ("reservations"."dates" BETWEEN $1 AND $2) [["dates", Mon, 30 Jan 2017], ["dates", Fri, 03 Feb 2017]] 

ActiveRecord::StatementInvalid: PG::InvalidTextRepresentation: ERROR: malformed range literal: "2017-01-30" 
+0

「Event.where(date:date1 ... date2)」のようなものは、あなたの状況では機能しませんか? – Iceman

+0

いいえ、私の場合、日付列は日付ではなくdaterangeです。 – Nerian

+0

答えの[編集]セクションにクエリの出力を貼り付けました。 – Nerian

答えて

1

ifロジックが安定しているようです。たぶん、あなたは

Event.where("dates && daterange(?, ?, ?)", 
      dates.begin, dates.end, dates.exclude_end? ? '[)' : '[]') 

のように、もっとこの方法でそれを簡略化することができ、すべての変数は、2つの異なるクエリを使用する必要はありません&パラメータをバインドしています。

daterangeはPostgreSQL固有の型であり、ORMではあまりよくサポートされていません。 (また、ActiveRecordは範囲をBETWEENの式としてバインドするので、値としてバインドすることはできません)。

関連する問題