2017-08-01 16 views
1

データベースにクエリを作成し、イベントを開始日でフィルタリングする必要がありますが、列の種類はDateTimeです。 私がモデルにスコープを作っ:RailsはDateTimeを日付に変換します。 'where'クエリ

scope :day, -> (start_date) {where start_date: start_date} 

それは同じDateTime値のために正常に動作しますが、私は日付だけではなく、日時によってEventを取得するには、フィルタを必要としています。

私はPGのデータベースを持っているし、試してみてください。

scope :day, -> (start_date) {where("start_date:date =?", "#{start_date.to_date}")} 

を私はエラー

+0

ウィルあなたのために、この作品のようなもの: '( 'DATE(スタート)=? '、start_date.to_date) 'あなたはRails 5.1ですか? – Deep

答えて

4

を取得するあなたはこれまでに、データベースの値をキャストする場合は、異なるデータベース・サーバに別のことを行う必要があるでしょう、MySQLの以下のように:

scope :day, -> (start_date) {where("DATE(start_date) = ?", start_date)} 

ので日時にごstart_dateの引数をキャストする方が賢明である場合があります。

また、
scope :day, -> (start_date) {where start_date: start_date.to_datetime} 

、BigRon posted優れたアプローチを開始し、一日の終わりとディープpostedさらにそのアプローチを合理化するのRails 5.1のためのヘルパーの間でフィルタリングするが、あなたが本当にあなたのデータベースの列が実際にdatetime型の場合にする必要があるかどうかを検討すべきです日付だけでフィルタリングしたいとします。

は、あなたが一日の終わりに一日の始まりのための範囲を使用することができます
+0

データベースフィールドにはdatetime型が必要です。このフィールドには開始日と開始時刻が格納されています – dendomenko

2

scope :day, -> (start_date) {where start_date: start_date.beginning_of_day..start_date.end_of_day} 
7

あなたはこのようにそれを行うことがあります。

SQL日付関数を使用するには、(これはデータベースに依存しますMySQL用):

scope :on_day -> (start_date) { where("DATE(start_date) = ?", start_date.to_date) } 

または範囲を使用して(これはちょうどその日の開始時刻と終了時刻を使用してBETWEEN Qを実行する日付と時刻の両方を使用してチェックしますueryで):

scope :day, -> (start_date) { where start_date: start_date.beginning_of_day..start_date.end_of_day } 

場合やのRails 5.1(これはRailsの5.1で導入された新しいヘルパーです)上:

scope :day, -> (start_date) { where start_date: start_date.all_day } 
関連する問題