0

ステージ:

私はこのモデルを持っています:

Promo(id: integer, start_date: datetime, end_date: datetime)

現在のプロモーションを知りたいです。クエリは次のようになります。

SELECT * FROM promos WHERE now BETWEEN start_date AND end_date;

質問:

Rubyでどのように作成すればよいですか?正しい方法はどれですか?

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

4

3 に答える 3

2

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 を使用しています。

于 2012-10-26T05:48:40.060 に答える
0

はい、比較演算子を使用して日付を比較できます。

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 を返します

これが役立つことを願っています。

于 2012-10-26T04:43:45.830 に答える
0

これをテストしていませんが、次のようなものを試してください:

currentTime = Time.now()
Promo.find(
     :all,
     :conditions => ['start_date < ? AND end_date > ?', currentTime, currentTime]
)

クラスが機能しないDate場合は、クラスを使用する必要がある場合がありますTime

于 2012-10-26T04:56:23.857 に答える