ステージ:
私はこのモデルを持っています:
Promo(id: integer, start_date: datetime, end_date: datetime)
現在のプロモーションを知りたいです。クエリは次のようになります。
SELECT * FROM promos WHERE now BETWEEN start_date AND end_date;
質問:
Rubyでどのように作成すればよいですか?正しい方法はどれですか?
ありがとうございました。
ステージ:
私はこのモデルを持っています:
Promo(id: integer, start_date: datetime, end_date: datetime)
現在のプロモーションを知りたいです。クエリは次のようになります。
SELECT * FROM promos WHERE now BETWEEN start_date AND end_date;
質問:
Rubyでどのように作成すればよいですか?正しい方法はどれですか?
ありがとうございました。
Rails はインテリジェントです。日付/時刻を取得すると、DateTime オブジェクトに変換されます。逆に、(Rails 3.x の場合) where 句に DateTime オブジェクトを渡すと、where 句が正しく作成されます。
where 句に渡された文字列は、SQL where 句に渡されます。配列を渡すと、2 番目以降の要素は「?」に置き換えられます。最初の要素の文字。
だから、あなたの場合:
Promo.where(["? between start_date and end_date", DateTime.now])
動作します。たまたま start_date と end_date があり、正しく動作する Rails モデル (Position) で検証しました。
[1] pry(main)> Position.where(["? between start_date and end_date", DateTime.now]).count
=> 2914
Rails 3.2.8 と PostgreSQL を使用しています。
はい、比較演算子を使用して日付を比較できます。
irb(main):018:0> yesterday = Date.new(2009,6,13)
=> #<Date: 4909991/2,0,2299161>
irb(main):019:0> Date.today > yesterday
=> true
しかし、日付を日時と比較しようとしていますか?
その場合は、datetime を日付に変換してから比較します。
また
Date.parse('2010-11-01') < Date.today
「2010-11-01」がすでに過ぎている場合は true を返します
これが役立つことを願っています。
これをテストしていませんが、次のようなものを試してください:
currentTime = Time.now()
Promo.find(
:all,
:conditions => ['start_date < ? AND end_date > ?', currentTime, currentTime]
)
クラスが機能しないDate
場合は、クラスを使用する必要がある場合がありますTime