2012-01-05 11 views
2

私たちのアプリは、データタイムであるlease_dateのフィールドを持つlease_bookingモデルを持っています(私たちは開発用にsqliteを、本番用にはmysqlを使用しています)。アプリは特定の日付にすべてのlease_bookingを見つける必要があります。コードは次のようである:レール3.1のdatetimeフィールドの日付部分を比較するにはどうすればいいですか?

LeaseBooking.where("lease_date == ?", '2012-1-5') 

問題はlease_date日付+時刻の形式であるため、我々は2012年1月5日上の任意のlease_bookingを見つけることができないということです。どのようにアプリケーションは、レール3.1のdatatimeフィールドの日付部分だけを比較することができますか?

ありがとうございました。

答えて

3

代わりに、この試してみてください。

scope :booking_date, lamda {|d| where('lease_date > ?', Date.parse(d).to_time).where('lease_date < ?', (Date.parse(d) +1).to_time)} 

をそして、ちょうどwhere -chainingは醜いですが、あなたがする、複数の?プレースホルダ、または名前の変数を使用できるかどうか

LeaseBooking.booking_date('2012-01-05') 

を呼び出しますこれは1つのステートメントでは、DBに非常に依存します。 ARelは、醜い連鎖クエリを効率的なSQLに変換することにもかなり優れています。

4

私はあなたがしなければならないだろう怖い:コール「日付」機能は実際にはないので、

LeaseBooking.where("date(lease_date) = ?", '2012-1-5') 

はたぶん良い答えがある(一つだけ=記号で) ActiveRecordのためのかなり!コメントでは、Jason Lewis氏のように、DB特有のものです。

+0

DBに固有ですが、 '2012-1-5'をDateTimeまたはTimeに強制すると、UTCまたはUTCの午前0時にその日付のみが一致するため、DB側で日付を強制する必要があります時間である。 –

+0

ありがとうございます。私たちはSQLiteとMySQLを使用していて、どちらもdate()をサポートしています。 – user938363

関連する問題