2017-09-18 4 views
-1

私はレールアプリケーションを持っており、フィルタリング機能があります。フィルタリング基準の1つが時間値であり、時間基準でフィルタリングしようとすると間違った結果が表示され続けます。2つのRuby on Rails論理文の違いは何ですか?

**変数名に間違いはので、私は、私はフィルタリング機能を実行すると、結果は

start_time = DateTime.new(2000, 1, 1, 6, 0, 0) 
end_time = DateTime.new(2000, 1, 1, 9, 0, 0) 

を編集していた:

Item.where("(start_at >= ? AND start_at < ?) OR (end_at > ? AND end_at <= ?) OR (start_at < ? AND end_at > ?)", start_time, end_time, start_time, end_time, start_time, end_time) 
=> Item id: 5931 

しかし、この結果と私は同じ文を実行結果は次のようになります。

(Item.find(5931).start_at >= start_time AND Item.find(5931).start_at < end_time) 
=> false 
(Item.find(5931).end_at > start_time AND Item.find(5931).end_at <= end_time) 
=> false 
(Item.find(5931).start_at < start_time AND Item.find(5931).end_at > end_time) 
=> false 
(Item.find(5931).start_at >= start_time AND Item.find(5931).start_at < end_time) or (Item.find(5931).end_at > start_time AND Item.find(5931).end_at <= end_time) or (Item.find(5931).start_at < start_time AND Item.find(5931).end_at > end_time) 
=> false 

誰かがポイントを見つけることができますか? 必要な情報が不足している場合は教えてください。 2回の間でデータをSQL BETWEENキーワードを使用するためにクエリに

+1

ませ鷹の目がなく、次のとおりです。Railsの4で

Item.where(start_at: start_time..end_time) .or(Item.where(end_at: start_time..end_time)) 

は、SQL文字列を記述する必要があります。

あなたがRailsの中.or方法5を使用することができOR句を追加するには'終わり 'は許されますか? Rubyの 'end'は予約語ではありませんか? – vee

+0

@vee間違いを申し訳ありません。変数名は異なっていましたが、わかりやすくするために変数名を変更しましたが、私は注意しませんでした。私は今これを変更します。 –

+0

私が見ることができる基本的な違いは、条件に従ってデータをフェッチするSQLクエリを実行している最初のステートメントであり、2番目のステートメントでは特定のデータをフェッチして、Railsを使用してその属性をチェックしています。 – Deep

答えて

0

start_time..end_time

Item.where(start_at: start_time..end_time) 
# => SELECT "items".* FROM "items" WHERE ("items"."start_at" BETWEEN $1 AND $2) [["start_at", 2000-01-01 06:00:00 UTC], ["start_at", 2000-01-01 09:00:00 UTC]] 

..Range objectを作成する特殊な構文です。確かに

Item.where(
    '(items.start_at BETWEEN :s AND :e) OR (items.end_at BETWEEN :s AND :e)', 
    s: start_time, e: end_time 
) 
関連する問題