2017-04-19 8 views
2

特定の日付範囲内にあるstart_atまたはend_atのレコードを見つけるためにActiveRecordの慣用方法がありますか? (基本的に、特定の時間枠内で開始または終了するレコードを見つける必要があります)。ActiveRecord multiple日付範囲

Project.where('(start_at >= ? AND start_at <= ?) OR (end_at >= ? AND end_at <= ?)', start_at, end_at, start_at, end_at) 
+0

を[この回答](http://stackoverflow.com/a/15477926/979091)Arelのより大きい/より小さい関数を使用すると便利です。 – omnikron

+0

オムニクロンああ、 'gt'と' lt'、おかげで、ありがとう、ありがとう。 –

答えて

6

をあなたがwhererangesを渡すとorを使用することができます:ここで私が現在やっているものだ

time_range = (start_at..end_at) 
Project.where(start_at: time_range).or(Project.where(end_at: time_range)) 
+0

はRails 4で 'or'サポートされていますか? –

+0

いいえ、またはレール5に入っています –

1

RailsのためにあなたがBETWEENhashのparams使用することができます4:たぶん

Project.where(
    "(start_at BETWEEN :start_at AND :end_at) OR (end_at BETWEEN :start_at AND :end_at)", 
    start_at: start_at.beginning_of_day, end_at: end_at.end_of_day) 
+0

は包括的ではありませんか?なぜあなたは 'beginning_of_day'と' end_of_day'を使用していますか? –

+1

データベースの列のデータ型によって異なります。 'beginning_of_day'と' end_of_day'はあなたのクエリが 'DATETIME'型で関連する結果を返すようにします。 – ehoffmann